请问,memset(this,0,sizeof(*this)) 是错误行为。
http://topic.csdn.net/u/20111127/22/c5ba536d-e995-4a98-8c76-f2e4ac73a044.html
原帖在这里,
supermegaboy 说 memset(this,0,sizeof(*this)) 是错误行为。 错误行为
原因我估计是
构造函数还没有运行完
this可以用
但是 *this是不能用的!!!!!
因为没有完成
但是从反汇编看, 调用构造函数分为三步:一:临时对象在程序编译的时候已经分配内存,临时对象大小已经确定了
比如:你在main函数中 写: XXX obj;
二,调用构造,用0cccc cccch 初始化,
然后调用memset, 看不出有什么问题啊
菜鸟一名,胡说大家见谅,希望能解决心中的疑惑!!!今早要上班,公司上网不方便, 晚上才能回家,
不能及时跟帖子,请大家见谅!!!!
第二个问题:
- C/C++ code
#include<iostream>class Test{public: Test(){std::cout<<"构造"<<std::endl;} Test(Test const& obj) { std::cout<<"拷贝构造"<<std::endl; } ~Test(){std::cout<<"析构"<<std::endl;} public: void f(int i) throw (Test) { if(i==0) throw Test(); } void what() const { std::cout<<"发生异常"<<std::endl; }};int main(){ try { Test obj; obj.f(0); } catch(Test e) //这里不用引用,说是:obj拷贝一个临时对象,临时对象,然后拷贝生成了e { e.what(); } return 0; }反汇编没有看懂, try 中 f函数帧中 throw了一个Test,然后拷贝构造了一个临时对象在main函数帧中, 运行到catch的时候:
mian函数帧又 根据 那个临时对象 生成 e对象??? 不知道我的这个说法对不对???
不对请指出
[解决办法]
原帖在这里,
supermegaboy 说 memset(this,0,sizeof(*this)) 是错误行为。 错误行为
原因我估计是
====
原因是C++与C是不同的。
C++的类虽然兼容C中的结构体,但是他们还是有本质的区别
在C语言中,memset一个结构体是个明智的做法,但是在C++中不是。一个C++类中除了需要空间来存放数据成员之外,还可能保存着虚函数表指针S,偏移量等信息,一但你memset之后全都没有了。所以这是错误的行为。而且memset完全可以用构造函数的初始化列表来代替。
[解决办法]
第二问大概是那样子,因为不是引用,我也不太懂你的意思,总之在C++primer上面的异常处理那章说到了。可以去看看。
[解决办法]
因为编译器在构造函数里面插入了很多代码。比如设置vptr的指向。如果你用memset那么意味着vptr被你修改了。那么如果你的类里面有虚函数的话那么这总是个错误。
[解决办法]
类里面如果有成员对象是构造生成的,那么这么一设置,对象可不就是失效了。