关于delete this

大脚板 2004-03-24 08:43:25
看到ACE中有delete this中的用法,有所不解
class B
{
public:
bool show(void)
{
OutputDebugString("show");
return true;
}
void del(void)
{
OutputDebugString("delete 1");
delete this;
OutputDebugString("delete 2");
}
};


int _tmain(int argc, _TCHAR* argv[])
{
B* b=new B;
b->show();
b->del();
b->show();

system("PAUSE");
return 0;
}

虽然上边的代码能运行,但delete this好象并没有起作用
求教
...全文
106 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuzhufox 2004-07-28
  • 打赏
  • 举报
回复
delete this是一种恶心的作法。
C++的设计原则是由同一个对象分配内存和释放内存。
COM里的delete this是因为它使用了引用计数,到计数器为0了才释放内存,我认为是无奈的做法。
nightfallrove 2004-07-28
  • 打赏
  • 举报
回复
同意 LocalVar(分乃身外之物,即使我回答对了,也别给分)
大脚板 2004-07-28
  • 打赏
  • 举报
回复
to zhuzhufox(狐狸的小猪)
有时候delete this会方便很多
比如网络编程中,一个对象在收到OnClose时要释放自己
smartlife 2004-03-24
  • 打赏
  • 举报
回复
我的是vc6 +sp5

大脚板 2004-03-24
  • 打赏
  • 举报
回复
to smartlife(tiro is my aim)
我确实是可以的,你单步跟踪看看
我用的是vs.net 2003
LocalVar 2004-03-24
  • 打赏
  • 举报
回复
大家要分清类的数据和代码,数据能被delete掉,但代码不能,否则如果类的其他实例也引用者转代码,那麻烦不久大了吗?
而搂主的函数
class B{
bool show(void)
{
OutputDebugString("show");
return true;
}
...
}
在编译器看来是下面的样子
bool show(B* this)
{
OutputDebugString("show");
return true;
}
虽然第二次调用show时,this是一个无效指针,但函数show中并没有使用它,所以不会有任何错误。
smartlife 2004-03-24
  • 打赏
  • 举报
回复
szStr="delete 2\n"; 去掉之后: output输出:
构造
show
delete 1
析构

OutputDebugString faulted during output
First-chance exception in temp.exe (KERNEL32.DLL): 0xC0000005: Access Violation.
First-chance exception in temp.exe (KERNEL32.DLL): 0xC0000005: Access Violation.
smartlife 2004-03-24
  • 打赏
  • 举报
回复
OutputDebugString(szStr.c_str());却照样可以执行 这个我这里不行呀。 不能执行异常呀
smartlife 2004-03-24
  • 打赏
  • 举报
回复
void del(void)
{
szStr="delete 1\n";
OutputDebugString(szStr.c_str());
delete this;
szStr="delete 2\n"; // 异常 去掉这句 下面的异常
OutputDebugString(szStr.c_str());
}
大脚板 2004-03-24
  • 打赏
  • 举报
回复
class B
{
private:
std::string szStr;
public:
B(void)
{
szStr="构造\n";
OutputDebugString(szStr.c_str());
}
~B(void)
{
szStr="析构\n";
OutputDebugString(szStr.c_str());
}
bool show(void)
{
szStr="show\n";
OutputDebugString(szStr.c_str());
return true;
}
void del(void)
{
szStr="delete 1\n";
OutputDebugString(szStr.c_str());
delete this;
szStr="delete 2\n";
OutputDebugString(szStr.c_str());
}
};

修改后,在szStr="delete 2\n";这句出错,
不过屏蔽掉szStr="delete 2\n"; 后
OutputDebugString(szStr.c_str());却照样可以执行

xstring(麻雀) 和 iicup(双杯献酒) 两位高人说的我都试过,是正确的

但我还是有些地方不理解
1、没有使用成员变量的函数是否就如同静态函数?
2、del(void)函数是如何出栈的?
3、已经调用了析构函数,szStr应该也已释放,但为何还很引用?

望指点

nlstone 2004-03-24
  • 打赏
  • 举报
回复
to楼上:
拜托用用你的头脑好不好,如果会死掉,楼上怎么还会把这个问题贴出来,~晕...
gieroland 2004-03-24
  • 打赏
  • 举报
回复
void del(void)
{
OutputDebugString("delete 1");
delete this;
OutputDebugString("delete 2");
}
帅哥们,我觉得第二个OutputDebugString就会死掉
双杯献酒 2004-03-24
  • 打赏
  • 举报
回复
delete this;
作用有2:
(1)释放new的内存,如果没有,调试环境会提示内存泄露。
(2)调用类的析构函数,您的这个类没有析构函数.
xstring 2004-03-24
  • 打赏
  • 举报
回复
to smallbugworm(虫虫)

当然可以在成员函数中使用了,在Com中这种使用方法普遍存在

不过当调用了以后,要保证不在对delete的实例进行任何的操作
smallbugworm 2004-03-24
  • 打赏
  • 举报
回复
delete this好象是类自杀了
不能在成员函数中使用吧
期待高手的讲解
nlstone 2004-03-24
  • 打赏
  • 举报
回复
你给B加个成员试试,我想del以后这个成员就被干掉了...
xstring 2004-03-24
  • 打赏
  • 举报
回复
甚至你都可以这样

B* b = NULL;
b->show ();

你运行这段代码,你都会发现,b->show ()照样正常工作
xstring 2004-03-24
  • 打赏
  • 举报
回复
因为b->show ();根本没有用到类实例当中的任何内容,所以你觉得delete this没起作用

实际起作用了

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧