您的位置:首页 > 其它

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

2017-03-29 14:38 211 查看

结构体包含 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() 来分配内存喽~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐