0

次のようなポインターがあるとします。

int *thingy;

ある時点で、このコードが呼び出される場合と呼び出されない場合があります。

thingy=new int;

これができるかどうかを知るにはどうすればよいですか:

delete thingy;

すべてのポインターにaを使用し、を使用するたびにboolbool をマークすることもできますが、多くのポインターがあり、非常に扱いにくくなります。truenew

newを呼び出していない場合、それをthingy呼び出すとdeleteクラッシュする可能性がありますよね?

かなり検索しましたが、明らかに自分の状況に合う答えが見つかりませんでした。

編集:deleteポインターが必ずしもデータを指していなくても、何度でもポインターを使用できるようにする必要があります。これが不可能な場合は、コードを書き直す必要があります。

4

4 に答える 4

4

常に NULL に初期化する

int *thingy = NULL;

その後

delete thingy;
thingy = NULL;

thingy が NULL の場合でも有効です。不要な副作用がないthingy限り、削除は何度でも実行できます。NULL delete

于 2013-04-17T03:12:02.097 に答える
0

追跡を行うラッパー クラスを作成します。たとえば、次のようになります。

template<typename T>
class ptr_t
{
private:
    T* m_ptr;
    bool m_delete;

    ptr_t(const ptr_t&) {}
    ptr_t& operator=(const ptr_t&) { return *this; }

public:
    ptr_t()
        : m_ptr(NULL), m_delete(false)
    {
    }

    ptr_t(T *ptr, bool del)
         : m_ptr(ptr), m_delete(del)
    {
    }

    ~ptr_t()
    {
       reset();
    }

    void assign(T *ptr, bool del)
    {
        if (m_delete)
            delete m_ptr;
        m_ptr = ptr;
        m_delete = del;
    }

    void reset()
    {
        assign(NULL, false);
    }

    operator T*() { return m_ptr; }
    bool operator!() const { return (!m_ptr); }
};

typedef ptr_t<int> int_ptr;

.

int_ptr thingy;
...
thingy.assign(new int, true);
...
thingy.reset();

.

int i;
int_ptr pi;
...
pi.assign(&i, false);
...
pi.reset();
于 2013-04-17T04:37:29.993 に答える
0

ポインターがヒープ データを指しており、安全にdeleted できるかどうかを識別する組み込みの C++ ツールはありません。NULL ポインターを削除しても安全であり、データが削除されたすべてのポインターを NULL に設定できます。しかし、これは、ヒープ データへのポインターと他のデータまたはコードへのポインターを区別するのに役立ちません。

オペレーティング システムがプロセスを開始すると、コード セクションとデータ セクションが特定のデータ領域に配置されます。Windows では、これは EXE ファイルの PE ヘッダーによって部分的に制御されます。したがって、メモリ領域の実際のアドレスは異なる場合があります。ただし、これらの領域がどこにあるかを特定できます。

  • コード
  • BS
  • データ
  • スタック
  • ヒープ

各領域のアドレス範囲を取得したら、ヒープ データへのポインター (delete が適切な場合) とスタック データへのポインターを区別できます。deleteこれにより、ポインターを削除してはならないデータとデータを区別できます。

于 2013-04-17T04:21:42.603 に答える