2016-10-10 40 views
-2

我有以下代码。析构函数不在C++中执行

#include <string.h> 
#include <iostream> 

using namespace std; 

class Fred 
{ 
    private: 
     char* _cptr; 

    public: 

     Fred() 
     { 
      _cptr = new char[strlen("Hello World") + 1]; 
      strcpy(_cptr, "Hello World"); 
     } 

     ~Fred() 
     { 
      cout << "Fred::~Fred(): " << _cptr << endl; 
      delete _cptr; 
     } 

     void Display() const 
     { 
      cout << "Fred::Display() _cptr: " << _cptr << endl; 
     } 
}; 

int main() 
{ 
    Fred* p = new Fred(); 
    if (p == NULL) 
     cout << "fail" << endl; 
    p->Display() ; 

    p = NULL; 
    delete p; 

    getchar(); 
    return 0; 
} 

输出 弗雷德::显示()_cptr:你好世界 009A02D8

int main() 
{ 
    Fred* p = new Fred(); 
    if (p == NULL) 
     cout << "fail" << endl; 
    p->Display() ; 

    //p = NULL; 
    delete p; 

    getchar(); 
    return 0; 
} 

输出 弗雷德::显示()_cptr:你好世界 弗雷德::〜弗雷德():你好世界

任何想法为什么析构函数不在第一种情况下工作(p = NULL)。

感谢 MAP

+0

切换这些行:'p = NULL; 删除p;''删除NULL;'是一个NOP,你正在泄漏原始实例。 –

+0

为什么呢?你并没有删除'new'返回的指针。 –

+0

不同意“接近错字”投票 - 在我看来,OP有意用这种方式编写代码,并不理解它的含义 –

回答

0

考虑在第一种情况下的流动:

  1. 您使用new运算符
  2. 你打电话与它的一些方法(无关紧要的问题)分配的Fred一个新的实例。
  3. 您将NULL指定给指针,从而有效地丢失了您创建的对象。
  4. 您在NULL指针上运行delete

由于delete未在有效对象上运行,因此无法调用析构函数。

2

在第一种情况下,你永远不会被删除由new Fred()分配的对象。

在删除对象之前,您将p变为空指针。该对象仍然存在,它只是没有指向它的指针。名称p不再以任何方式与该对象关联。然后delete p;什么都不做,因为删除空指针被定义为什么也不做。