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