0

重複の可能性:
複数のポインターを安全に削除する方法

以下のコードのように:

#include <iostream>
using namespace std;

int main(int argc, _TCHAR* argv[])
{
    int *p, *q;
    q = new int;
    p = q;
    delete q;
    q = NULL;
    cout << p << "  " <<q << endl;
    return 0;
}

pを指すqqq=を削除するとNULLpまだ古いアドレスを指しています。誰かが自動的にp指摘する方法を持っていますか? q NULLプログラム内に同じアドレスを指すポインターがたくさんあり、それらを指すようにすることができない場合NULL、問題が発生するためです。

4

2 に答える 2

4

その仕事をすることができる一種のスマートポインタがあります。このコードではスレッドセーフに問題がある可能性があります(実際、私はそうなることを保証します)。

template <class T>
class DoublyLinkedSmartPointer
{
   public:
      DoublyLinkedSmartPointer(const DoublyLinkedSmartPointer &other);
      DoublyLinkedSmartPointer& operator=(const DoublyLinkedSmartPointer& other);
      virtual ~DoubleLinkedSmartPointer();
      T * operator*();
      const T* operator*() const;

      void freeAll();
   private:

      DoublyLinkedSmartPointer *next, *previous;
      T * data;
}

基本的な考え方は、スマートポインターのコピーが作成されるたびに、初期化に使用されたスマートポインターを使用して、そのコピーをリストに追加することです。そして、ポインタを削除すると、リストからポインタを解放します。

ここで注意が必要なのは、すべてのポインターが他のすべてのポインターを知っているため、任意のポイントからリストをステップ実行し、すべてのノードでデータをNULLに設定できることです。

さて、それはあなたがそれを行うことができる方法です。しかし、もっと重要なことは、それをしないでください。ほぼ確実に、保守が難しく、デバッグがほぼ不可能なコードを作成することになります。最良のメモリ管理戦略は最も単純です。

于 2012-09-29T00:56:53.157 に答える
1

C++ プログラムに対する一般的なアドバイスは、基本ポインタを避けることです。これは、まさに発生している問題を回避するためです。代わりに、言語 (より正確にはその標準ライブラリ) のメソッドを使用してポインターを処理します。

std::vector1ヒープに割り当てられたメモリ (のチャンク) へのポインタの代わりに、 などのコンテナを使用する

2std::unique_ptrおよびstd::shared_ptr(およびstd::weak_ptr) を使用して、ヒープに割り当てられたオブジェクトを管理します。これは、移動セマンティクスを備えた C++11 でのみ適切に機能します。標準ヘッダーを参照してください。

利点: ダングリング ポインターを残さない自動割り当て解除。例外の安全性 (例外のスローとスタックの巻き戻しはメモリ リークを起こしません)。

于 2012-09-29T09:59:31.730 に答える