1

オブジェクト ポインターのベクトルがあります。これらのオブジェクトを削除し、それらのオブジェクトが占有しているメモリを解放できるようにしたいと考えています。

私が現在持っているのはこれです:

これは、オブジェクト ポインターを含むベクターです。

std::vector<Ball*> List;

これは、ベクトル内の要素を削除してメモリを解放する関数です。

void BallManager::DeleteBall(int id) 
{
    List[id]->~Ball(); //Not sure if this is needed
    delete List[id];
    List[id] = NULL;
    List.erase(List.begin()+id);
}

私の質問は、オブジェクトのデストラクタも呼び出す必要がありますか、それとも削除によって処理されますか?

4

3 に答える 3

2

ポインタ要素を削除したい場合は、deleteオブジェクト デストラクタを呼び出します。List[id]->~Ball()とにかく要素を消去するので、呼び出す必要もポインタを NULL に設定する必要もありません 。

std::vector<Ball*> List;

void BallManager::DeleteBall(int id) 
{
    if (id < List.size())   // should check id is still in range
    {  
      delete List[id];
      List.erase(List.begin()+id);
    }
}

Chris が述べたように、スマート ポインターを使用することを強くお勧めします。STL コンテナーから要素を削除するときに、オブジェクト ポインターの削除について心配する必要はありません。

  std::vector<std::shared_ptr<Ball> > List;
  void BallManager::DeleteBall(int id) 
  {
     if (id < List.size())   // should check id is still in range
     {  
        List.erase(List.begin()+id);
     }
  }
于 2012-12-22T04:17:31.593 に答える
1

いいえ、(dealloc ではなく) delete を呼び出すと、デストラクタが自動的に呼び出されます。

要素を削除した後、null に設定する必要もありません。削除するだけでかまいません。

void BallManager::DeleteBall(int id) 
{
    delete List[id];
    List.erase(List.begin()+id);
}

new は自動的にコンストラクタを呼び出し、対応する delete は自動的にデストラクタを呼び出します。

于 2012-12-22T03:36:15.530 に答える
0

デストラクタを明示的に呼び出す必要はほとんどありません。これらは、割り当て解除プロセスを通じて呼び出されます。動的に割り当てられたオブジェクトの場合は削除します。

詳細については、中途半端についてのデストラクタ FAQを参照してください。

于 2012-12-22T03:35:10.527 に答える