读书人

请教memset(this,0,sizeof(*this))

发布时间: 2012-11-19 10:18:51 作者: rapoo

请问,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被你修改了。那么如果你的类里面有虚函数的话那么这总是个错误。
[解决办法]
类里面如果有成员对象是构造生成的,那么这么一设置,对象可不就是失效了。

读书人网 >C++

热点推荐