+ -
当前位置:首页 → 问答吧 → PostNcDestroy 中Delete this 抛出异常的原因(分享)!

PostNcDestroy 中Delete this 抛出异常的原因(分享)!

时间:2011-12-05

来源:互联网


很发了几个帖子问 PostNcDestroy 中Delete this 抛出异常的原因,结果终于在此时此刻被我发现为什么了,分享一下!


原来是:我这个程序在ONinitDialog中创造了一个线程,这个线程是里面有个死循环WHILE, 当我在PostNcDestroy 中Delete this 后,这个线程没有终止,所以会执行并且访问类的变量等等,所以这时就会产生访问冲突!  

于是我句在PostNcDestroy 中delete this ; 前面加上了TerminateThread(TextThread,0); 结果,哈哈哈 终于没有访问冲突了。



特此分享给他家,避免我这种错误! 

说明Delete this 需要注意的东西:

(1)你必须100%的确定,this对象是用 new分配的(不是用new[],也不是用定位放置 new,也不是一个栈上的局部对象,也不是全局的,也不是另一个对象的成员,而是明白的普通的new)。

(2)你必须100%的确定,该成员函数是this对象最后调用的的成员函数。 

(3)你必须100%的确定,剩下的成员函数(delete this之后的)不接触到 this对象任何一块(包括调用任何其他成员函数或访问任何数据成员)。

(4)你必须 100%的确定,在delete this之后不再去访问this指针。换句话说,你不能去检查它,将它和其他指针比较,和 NULL比较,打印它,转换它,对它做任何事


我犯了第3条错误! 没分给了 (擦 居然必须要20分) 纯分享!

作者: qweewqpkn   发布时间: 2011-12-05

在析构函数里,做清理工作

作者: ouyh12345   发布时间: 2011-12-05

引用 1 楼 ouyh12345 的回复:

在析构函数里,做清理工作


意思是:TerminateThread(TextThread,0);放在析构函数里面?

作者: qweewqpkn   发布时间: 2011-12-05

TerminateThread的使用也会带来问题吧,线程还是内部自动终止的好。一般的情况还是谁new的谁delete。个人理解。纯小白。

作者: sduwuyuwenzjx   发布时间: 2011-12-05

引用 3 楼 sduwuyuwenzjx 的回复:

TerminateThread的使用也会带来问题吧,线程还是内部自动终止的好。一般的情况还是谁new的谁delete。个人理解。纯小白。


我知道会带来问题,不过没办法 将就了吧!

作者: qweewqpkn   发布时间: 2011-12-05

热门下载

更多