27

クラスに、動的に割り当てられたメモリ領域への静的ポインタを持たせたいと考えています。私はそれを初期化する方法を理解しています - 私の場合、最初のオブジェクトがそれを必要とするときに初期化します。ただし、コードのどこでいつ解放するのかわかりません。プログラムが終了したら解放したいと思います。

オブジェクトのデストラクタでポインタを解放できるかもしれませんが、そのオブジェクトが最後に使用されたときに解放しても安全かどうかを確認するために、オブジェクトの数を維持する必要があります。

これを行うよりエレガントな方法はありますか?

私にお知らせください。

ありがとう、ジブ

4

6 に答える 6

21

ここには 2 つの解決策があります。

  1. 削除しないでください(C++ を使用している場合は、new と delete を使用しますよね? ;))。今日のほとんどすべての OS は、アプリケーションが終了すると、アプリケーションによって割り当てられたメモリを「解放」します。しかし、これは良い解決策ではありません。たとえば、メモリ リークを検出するのが難しくなります。
  2. ポインターを (メンバーとして) クラスにカプセル化し、このクラスを static の型として使用します。そうすれば、アプリケーションの最後にクラス デストラクタが呼び出されることがわかります。次に、デストラクタでデータを削除するだけで、作業は完了してきれいになります。それがRAIIの力です。

2 を実行することをお勧めします。これは非常にクリーンな方法です。


簡単な例を次に示します。これを行う代わりに

static Thing* things = new Thing(); // or whatever way to initialize, here or in a specific function

あなたはそれをします:

class ThingManager // or whatever name you like
{
public:
   ThingManager( Thing* thing ) : m_thing( thing ) { }//or create it here? whatever solution suits your way of creating the data

   ~ThingManager() { delete m_thing; } // THAT's the important part!

    Thing* instance() const { return m_thing; } // or whatever accessor you need, if you need one

private:
    Thing* m_thing;
};

その後

static ManagedThing thing; // now i can access it via thing.instance() 

プログラムが終了すると、静的変数 (ポインターではなくなります) は破棄され、そのためにデストラクタが呼び出されます。

これは、どのようにそれを行うことができるかのアイデアを提供するためだけに書かれています。

于 2010-03-11T23:31:52.070 に答える
16

スマートポインターに投げます。静的な有効期間があり、main返された後に破棄されます。

static std::auto_ptr<T> thePointer;

もう 1 つのオプションは、独自のatexit関数を登録することです。

// static
void YourClass::freePointer(void)
{
    delete getPointer();
}

// static
T* YourClass::getPointer(void)
{
    if (!thePointer)
    {
        thePointer = new T;
        atexit(freePointer);
    }

    return thePointer;
}

これは同じ効果があります。すでに言及した別のオプションは、静的カウンターを保持することです。実際にはかなり効果的にまとめることができることに注意してください。

于 2010-03-11T23:39:23.037 に答える
7

OS の観点からは、プログラムが終了するときにメモリを解放しても意味がありません。終了が遅くなるだけです。アプリケーションを終了すると、アドレス空間全体が破壊され、ヒープに割り当てたすべてが一度に解放さます。アプリのシャットダウンを明示的に呼び出すことfreeは、とにかく破棄されるヒープ内のポインターをシャッフルすることです。

すべてを明示的に解放しようとする主な理由は、メモリ リークがなく、メモリ フットプリントが永遠に大きくならないようにするためです。

しかし、これが静的であり、1 つしか存在せず、他のすべてのオブジェクトが解放されるまで安全に解放できないことが確実な場合は、アプリケーションを許可するだけの方がよい場合があります。終了はあなたのためにそれの世話をします。

于 2010-03-11T23:34:10.473 に答える
2

静的変数をスマート ポインターとして宣言すると、プログラムが終了すると、割り当てられたポインターが解放されます。

于 2010-03-11T23:33:42.927 に答える
0

クラスに静的カウンターを定義して、デストラクタが実行されるときにオブジェクトインスタンスのカウントを追跡し、カウンターをデクリメントし、カウンター== 0の場合はメモリも解放します..あなたと同じように

于 2010-03-11T23:34:09.093 に答える