结构体包含 std::list 未初始化问题


Java学习者论坛:www.javaxxz.com

结构体包含 std::list 未初始化问题

由于在编写C++代码时,用到std::list<> ,而喜欢用malloc来进行结构体分配内存出现的问题。

struct play_list{
bool is_started;
int g_operate_id;
char *name;
CRITICAL_SECTION play_operate_section;
std::list<play_operate*> play_operate_list; //list
};

原因:

 std::list/map等都属于c++的类,当用malloc的时候并未进行初始化,而用memset(&play_list,0,sizeof(play_list)) 进行初始化又会把list中的一些字段给赋值为null。

修正:

play_list * plist = new play_list();

关于new play_list() 和new play_list区别 :

 new 分配内存有时会初始化,有时却不会,这依赖于是否是POD(Plain old data)类型,或者它是否是包含POD成员、使用编译器生成默认构造函数的类。

附:POD类型
POD是Plain old data的缩写,它是一个struct或者类,且不包含构造函数、析构函数以及虚函数。

维基百科给出了更加详细的解释:
C++的POD类型或者是一个标量值,或者是一个POD类型的类。POD class没有用户定义的析构函数、拷贝构造函数和非静态的非POD类型的数据成员。而且,POD class必须是一个aggregate,没有用户定义的构造函数,没有私有的或者保护的非静态数据,没有基类或虚函数。它只是一些字段值的集合,没有使用任何封装以及多态特性。
  • C++中的三种初始化方式
    • zero-initialization
    • default-initialization
    • value-initialization(C++2003标准中新引入)

看一段代码:

#include<iostream>

using namespace std;

struct A { int m; }; // POD
struct B { ~B(){}; int m; }; // non-POD, compiler generated default ctor
struct C { C() : m() {}; ~C(){}; int m; }; // non-POD, default-initialising m

int main()
{
A *aObj1 = new A;
A *aObj2 = new A();
cout << aObj1->m << endl;
cout << aObj2->m << endl;

B *bObj1 = new B;
B *bObj2 = new B();
cout << bObj1->m << endl;
cout << bObj2->m << endl;

C *cObj1 = new C;
C *cObj2 = new C();//默认构造已重写
cout << cObj1->m << endl;
cout << cObj2->m << endl;

delete aObj1;
delete aObj2;
delete bObj1;
delete bObj2;
delete cObj1;
delete cObj2;

return 0;
}

运行结果:
在vs2008 或2013中运行结果:

这里写图片描述

new A:不确定的值
new A():zero-initialize
new B:默认构造(B::m未被初始化)
new B():默认构造(B::m未被初始化)
new C:默认构造(C::m被zero-initialize)
new C():默认构造(C::m被zero-initialize)

如果用兼容C++03的编译器,比如G++结果:
这里写图片描述

new A:不确定的值
new A():value-initialize A,由于是POD类型所以是zero initialization
new B:默认构造(B::m未被初始化)
new B():value-initialize B,zero-initialize所有字段,因为使用的默认构造函数
new C:default-initialize C,调用默认构造函数
new C():value-initialize C,调用默认构造函数

总而言之呢,大多情况下最好使用new A() 来分配内存喽~~~

本站声明
本文转载自:http://blog.csdn.net/linux_vae/article/details/68064933     作者:linux_vae     发布日期:2017/03/29     本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。


 
© 2014-2017 ITdaan.com 粤ICP备14056181号