0

かなりの数の異なるオブジェクトからアクセスされるオブジェクトへのスマート ポインターを使用したいと考えています。したがって、すべてのポインターが解放されるまで、それを破壊したくありません。スマート ポインターは、いくつかのオブジェクトをインスタンス化するオブジェクトなどを指すため、この 1 つのポインターを介してすべての個々の System object にアクセスできます。ただし、メインにスマートポインターを次のように作成するとしましょうstd::shared_ptr<System> object(new System);次に、他のすべてのエンティティが派生する別のオブジェクトがあり、そこから静的 std::shared_ptr が設定され、上記のオブジェクトと等しく設定されているとします。static 宣言は、インスタンスごとではなく、コンパイラによって管理されることを意味します。したがって、基本クラスから派生するすべてのオブジェクトがこの静的ポインターを使用して System object にアクセスするとします。このスマート ポインターが破棄されるのはいつですか? このポインターは、メインのポインターの前に破壊する必要があります。破壊すると、参照カウントが0になり、それが指すオブジェクトが破壊されます。だから私の質問は、静的に宣言された std::shared_ptr が物事のスキームで破壊されるのはいつですか。あるいは、ポインタがグローバルに宣言され、どこでも使用されたとしても、このオブジェクトはいつ破棄されるのでしょうか?

基本クラスは次のようになります。

class Base
{
public:
    static shared_ptr<System> m_System;
};

int main()
{
    std::shared_ptr<System> system(new System);
    Base::m_System = system;

    /*
        other stuff
    */ 
    return 0;
}

また、誰かが私を助けることができるもう1つのこと、私はconst-nessがあまり得意ではありません。その静的ポインターを、派生クラスによって変更できない定数にしたいと考えています。しかし、それが const の場合、メインで行ったように初期化できませんよね? それで、constになるように宣言する方法はありますが、最初はこのようにポインターに等しく設定できます。

4

2 に答える 2

1

オブジェクトの参照が 2 つあるため、メイン関数を終了すると、参照カウンターが減少し、静的オブジェクトの破壊により参照カウンターが減少します。参照カウンターが 0 になると、システム オブジェクトが破壊されます。

于 2012-07-05T10:38:38.283 に答える
1

このスマート ポインターが破棄されるのはいつですか?

すべての静的オブジェクトと同様に、main終了後に破棄されます。

このポインターは、メインのポインターの前に破壊する必要があります。破壊すると、参照カウントが0になり、それが指すオブジェクトが破壊されます。

その場合、おそらく静的ポインターをweak_ptr. オブジェクトを存続させる参照カウントには参加しませんが、オブジェクトへの共有ポインターがある限り、オブジェクトへのアクセスを許可します。main()次に、ポインター(およびそのポインターの他のコピー) がスコープ外になると、オブジェクトは破棄されます。

あるいは、静的オブジェクトを避けることを検討する価値があるかもしれません。代わりに、オブジェクトを内部でインスタンス化し、main()それを必要とするものへの参照を渡します。これにより、静的オブジェクト (特に初期化順序) に関連するさまざまな問題が回避され、プログラムの依存構造がより明確になります。その場合、オブジェクトの有効期間はプログラムの有効期間にバインドされているため、おそらくスマート ポインターはまったく必要ありません。

于 2012-07-05T10:52:07.487 に答える