2016-10-10 12 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; 
} 

OUTPUT フレッド::ディスプレイ()_cptr:Hello Worldの 009A02D8

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

    //p = NULL; 
    delete p; 

    getchar(); 
    return 0; 
} 

OUTPUT フレッド::ディスプレイ()_cptr:Hello Worldの フレッド::〜フレッド():こんにちは世界

デストラクタがファーストケース(p = NULL)で動作していない理由についてのアイデア。

おかげで最初のケースで MAP

+0

次の行を切り替えます。 'p = NULL; delete p; '' NULLを削除する ';はNOPで、元のインスタンスを漏らしています。 –

+0

なぜでしょうか? 'new'によって返されたポインタを削除していません。 –

+0

は「close typo」投票に同意していません - 私はOPが意図的にこのようにコードを書いており、その意味を理解していないようです。 –

答えて

0

が最初のケースで流れを考えてみましょう:

  1. をあなたが(質問に対する取るに足らない)それにいくつかのメソッドを呼び出して、new演算子
  2. を使用してFredの新しいインスタンスを割り当てます。
  3. ポインタにNULLを割り当て、作成したオブジェクトを効果的に失います。
  4. NULLポインターでdeleteを実行します。

有効なオブジェクトでdeleteが実行されないため、デストラクタを呼び出すことができません。

2

あなたはnew Fred()によって割り当てられたオブジェクトを削除したことはありません。

オブジェクトを削除する前に、pをヌルポインタにします。オブジェクトはまだ存在し、ポインタを指すポインタはありません。 pという名前は、どのような形でもそのオブジェクトに関連付けられなくなりました。そして、delete p;は何もしません。ヌルポインタの削除は何もしないように定義されているからです。

関連する問題