不要对C++类对象或struct对象做memset操作
2014-01-04 11:41
246 查看
参考:http://stackoverflow.com/questions/1998752/which-one-to-use-memset-or-value-initialization-to-zero-out-a-struct
参考页面中有下面代码:
TestStruct t = {} 是正确的做法,而memset(&t1, 0, sizeof t1) 会导致crash。
crash的原因:
程序在第13行创建 t1 对象,在第15行出了{}作用域的时候,会自动执行 t1 的析构。
在析构到 t1 的string成员 b 的时候,因为 b 的内部结构都被 memset 破坏了(都赋成0了),从而不能正常进行析构操作,最终导致crash。
Crash时的callstack如下:
参考页面中有下面代码:
#include <string.h> int main() { struct TestStruct { int a; std::string b; }; TestStruct t = {}; // OK { TestStruct t1; memset(&t1, 0, sizeof t1); // ruins member 'b' of our struct } // Application crashes here return 0; }
TestStruct t = {} 是正确的做法,而memset(&t1, 0, sizeof t1) 会导致crash。
crash的原因:
程序在第13行创建 t1 对象,在第15行出了{}作用域的时候,会自动执行 t1 的析构。
在析构到 t1 的string成员 b 的时候,因为 b 的内部结构都被 memset 破坏了(都赋成0了),从而不能正常进行析构操作,最终导致crash。
Crash时的callstack如下:
(gdb) bt #0 0x00007f383f9154ab in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() () from /usr/lib64/libstdc++.so.6 #1 0x0000000000400810 in TestStruct::~TestStruct (this=0x7fff57c54ee0, __in_chrg=<value optimized out>) at t.cpp:11 #2 0x0000000000400889 in main () at t.cpp:20
相关文章推荐
- 不要对C++类对象或struct对象做memset操作
- C++类与对象(3) - 空class&struct的大小
- 不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator 方式,如果并发操作,需要对 Iterator 对象加锁
- 用ORM的思想操作XML文档,一个对象就搞定不要太简单。滚蛋吧!XmlDocument、XmlNode、Xml***……
- 在全局对象(不是指针)的构造函数里不要对std集合做太多操作
- 通过操作地址的方法来访问C++类对象中私有成员变量
- struct 和 (对象)std:string不要混用
- 浅谈Sharepoint权限 sharepoint 2010 不允许对继承权限的对象执行此操作
- 不同IE版本下,字符对象某些操作不同
- Java——IO流读写对象及流操作规律
- 不要使用JavaScript内置的parseInt()函数,利用map和reduce操作实现一个string2int()函数:
- 用nodejs访问ActiveX对象,以操作Access数据库为例。
- SharePoint【ECMAScript对象模型系列】-- 08. 组与用户操作(一)
- Oracle Gloden Gate 系列三 -- GG 支持与不支持的对象类型与操作 说明
- java设计模式--基础思想总结--父类引用操作对象
- C++类和对象知识点整理四---继承
- 不要在 foreach 循环里进行元素的 remove / add 操作
- AIR-文件操作:使用文件对象操作文件和目录
- JavaScript 操作JSON对象查找、删除、修改
- 利用脚本对游戏对象进行操作