0

C++を学んでいます。std::shared_ptr参照カウントのように、ヒープに割り当てられたオブジェクトを管理するために使用できることを学びました。

現在、私のコンパイラ (Xcode/Clang/C++11) は、私が望んでいた正確な動作を示しています。この結果を出力します。

Step0
Step1
CREATED!
Step2
Step3
Step5
DESTROYED!
Step6

このコードで。

class   Obj1
{
    public:
        Obj1() { printf("CREATED!\n"); }
        ~Obj1() { printf("DESTROYED!\n"); }
};

std::shared_ptr<Obj1> func1 ()
{
    printf("Step0\n");
    {
        printf("Step1\n");
        std::shared_ptr<Obj1>   o1(new Obj1());
        printf("Step2\n");
        std::shared_ptr<Obj1>   o2  =   o1;
        printf("Step3\n");
        return  o2;
    }
    printf("Step4\n");
}



int main(int argc, const char * argv[])
{
    {
        std::shared_ptr<Obj1>   o3  =   func1();
        printf("Step5\n");
    }
    printf("Step6\n");
    return 0;
}

しかし、私の知る限り、これは C++ のコピー コンストラクターの最適化によって、std::shared_ptr新しい変数に割り当てられたときに発生する可能性があります。(名前はわかりません...)そうである場合、実際には呼び出し元で意味的に破棄され、再作成されるObj1ため、関数から返されたときにインスタンスが生きていることが保証されていない可能性があります。shared_ptr

もちろん、これらはすべて初心者の仮定です。この場合、オブジェクトの有効期間に実際に期待されることを教えてください。

PS。これは私の以前の質問から派生したものです: クリーンアップ ヒープに割り当てられたオブジェクトのグッド プラクティスまたは規則は?

4

2 に答える 2

4

の存続期間が延長されるかo2、破棄される前にそのコピーが作成されます。いずれにせよ、少なくとも 1 つshared_ptrが常に存在するため、コードは安全です。

于 2013-02-28T04:00:02.527 に答える
4

その最適化がどのように機能するかを誤解しています。小さな例があるとしましょう:

std::shared_ptr<Foo> func()
{
    std::shared_ptr o2;
    o2.reset( new Foo  );
    return o2;
}
std::shared_ptr<Foo> o1 = func();

最適化によってコンパイラーができることは次のようになります (正確ではありませんが、アイデアを理解するのに役立ちます)。

void func( std::shared_ptr<Foo> &o2 )
{
    o2.reset( new Foo  );
}
std::shared_ptr<Foo> o1;
func( o1 );

したがって、あなたの観点からは、ほとんど何も変更されておらず、オブジェクト (スマート ポインター) のコピーのみが削除されます。Foo の寿命には影響しません。

于 2013-02-28T04:17:52.293 に答える