class CMessage
{
public:
CMessage(void);
~CMessage(void);
        .......
protected:
TCHAR *m_pData;
        .........    
}CMessage::CMessage(void)
{
m_pData = NULL;
}CMessage::~CMessage(void)
{
if(m_pData) delete []m_pData;
delete this;
}
void CDlg::OnBnClickedBtn()
{
    CMessage  *pMsg;
    pMsg = new CMessage;
    ......
    
    delete pMsg;  ----> CMessage 类的析构函数中有了{delete this}, {delete pMsg;}这句要不要?}

解决方案 »

  1.   

    你要是不调用delete pMsg,也不会触发析构函数啊。
      

  2.   

    随便,不过如果你这里delete了,记得再加一句pMsg = NULL;
      

  3.   

     CMessage 类的析构函数中 delete this;   --> 这句是多余的,是不是 ?
      

  4.   

    如果你的类都是通过 new 的话得来的,应该加上。
      

  5.   

    析构函数里不可以写delete this;
      

  6.   

    是的
    delete本来就是要调用析构函数的
    你在析构函数里面调用当然没用了,
    还有可能有问题呢
      

  7.   

    上面代码是别人写的,我在看。delete this; 这句有问题.
      

  8.   

    delete this
    这种写法是很错误的
    如果是个局部变量,分配在栈上。
    等生命周期结束时调用析构delete
    会出现异常
    delete只能释放堆上动态分配的内存。
    你不能保证类对象的内存分配方式。
      

  9.   

    见过我们以前的一个项目经理,在析构时用到过delete this;
    当时见那个类比较复杂,静态成员比较多,具体的不记得了
    不过一般情况下是用不到的
      

  10.   

    今天在COM本质论中确实看到了delete this的用法,在接口与实现分离中,所以赶紧过来补贴,希望没有给大家造成误解,呵呵~~~它对外界封装该类,开放一个类对象的生成接口函数,确保了所有对象都是new出来的。
    开放一个释放成员函数调用delete this;
    但delete this 放在析构函数中还是不对的,在调用operator delete之前进析构,这样造成了一个死循环。
    下面是示例代码,最后造成堆栈溢。
    int g_icount = 0;class A
    {
    public:
    ~A()
    {
    cout<<g_icount++<<endl;
    delete this;
    }
    private:
    int m_idata;
    };
    int _tmain(int argc, _TCHAR* argv[])
    {
    A* la = new A;
    la->~A();
    }