1

このようなクラスがあるとしましょう

  class Level
  {
    public:

     Level(std::string);
     ~Level();

    private:
     Bitmap* map;  
  }

そして、あなたがこれを持っていたクラスで

Level::Level(std::string)
{
  map = new Bitmap(path);
}

電話してもらえますか?

Level::~Level()
{
 delete map;
}

クラスが範囲外になるのではないかと心配していたので、マップを削除していません。それでは、メモリリークが発生しませんか。マップを削除するには、手動で呼び出す必要がありますか。プログラムのコンストラクターで delete を呼び出すとクラッシュします。

マップを削除する場所で、マップを破棄するというレベルにメソッドを追加できるように。しかし、デストラクタに削除を追加できないのはなぜだろうと思っていました。

4

6 に答える 6

4

オブジェクトがスコープ外にLevelなると、そのデストラクタが呼び出されるため、メモリが不要になるため、メモリの解放が役立ちます。を使用することもできunique_ptrます。これにより、メモリの割り当てが自動的に解除されます。

于 2013-11-06T01:17:37.287 に答える
3

これが、デストラクタが表す理由です。オブジェクトが保持していたメモリが解放されるように、デストラクタは、オブジェクトがスコープ外に出たとき (スタック オブジェクトに存在するメモリ) またはdeleteが呼び出されたとき (動的に割り当てられたオブジェクトの場合) に明示的に呼び出されます。delete破棄されたときにメンバー オブジェクトのメモリを解放する場合は、 (またはdelete[]配列に対して)を使用して各オブジェクトのデストラクタを呼び出すことができます。意図しないメモリ リークを回避し、RAII の概念 ( C++ の RAII およびスマート ポインタ)を使用するため、すべての場合にメモリが正しく解放されるようにするために、スマート ポインタを使用することをお勧めします。

于 2013-11-06T01:20:34.123 に答える
3

回答は、オブジェクトがスコープ外になったときにデストラクタが呼び出されることを信頼できることをすでに指摘しています。繰り返しません。Bitmapwithを割り当てる必要がないことを指摘したかっただけnewです (カスタム メモリ アロケータを使用していない限り、ここでは当てはまりません)。初期化子リストを使用して構築できます。

class Level
{
  public:
    Level(std::string);

  private:
     Bitmap map;  
};

Level::Level(std::string)
    : map(path)
{
}

今では自動スコープがあり、デストラクタについて心配する必要はありません。

于 2013-11-06T01:24:59.267 に答える
-3

これは珍しい方法です。通常、オブジェクトの寿命は、オブジェクト以外の要因によって決定されます。

しかし、実際には、MFC は Window が破棄されているときにこれを行っていました (今でも行っていますか?)。(WM_NCDESTROY への応答として、私は信じています。) これにより、ウィンドウがなくなった後に Window インスタンスがメモリをリークすることがなくなります。

したがって、場合によっては有効であると言えます。あなたはそれをクラスの自殺と呼ぶかもしれません!

于 2013-11-06T01:18:58.923 に答える