结构体包含 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() 来分配内存喽~~~
相关文章推荐
- UserControl 中包含封装了集合对象的属性被设计器自动初始化所引起的错误!也有关于List的问题
- UserControl 中包含封装了集合对象的属性被设计器自动初始化所引起的错误!也有关于List的问题
- UserControl 中包含封装了集合对象的属性被设计器自动初始化所引起的错误!也有关于List的问题
- 尚硅谷第四课0722班 java-特殊流程控制 -数组元素的默认初始化-数组操作常见问题-Java内存的结构
- android 中list结构 和适配器结构position问题
- 用 TStringList 存取结构的例子 - 回复 Test1234 的问题
- List的All方法使用问题:我用List1的All方法来确保List1的所有每个数组元素中是否包含Arr1中的任意元素,这个部分很难实现。 因为,没有一个数组中是否包含另一个数组中的任意元素这个功能
- std::list问题
- 关于memset初始化结构被滥用的问题
- 模板类中定义std::list::iterator iter容器的迭代器变量的问题
- 直接比较两个对象是否相等返回false和List中判断是否包含某个对象的问题
- 一个分别使用std::list的remove和erase的问题
- 解决 构造函数 包含业务逻辑 IDE无法初始化界面的问题
- NDK无法包含std的头文件(string,list等)的解决方法
- 字符串移位包含的问题 结构之法 1
- 使用std的vector,map,list, set等注意问题
- 结构中包含CString成员,请你不要memset初始化!
- utl_dbws.ANYDATA_LIST类型初始化问题
- C++11特性--统一的初始化,std::initializer_list
- 用List <Object[]>类型保存的, 这个结果只包含一列数据问题