は、次のコードを考えてみましょう:もっと慣れ親しんでポインタを置き換える方法はありますか?
#include <memory>
#include <stdio.h>
#include <stdexcept>
class Foo {
public:
Foo(int n) { val =n; printf("Hi %d\n", val); };
~Foo() { printf("Bye %d\n", val); };
private:
int val;
};
int main()
{
std::shared_ptr<Foo> p = nullptr; // I don't know what I want yet
p = std::make_shared<Foo>(1); // OK, I've decided
// I've changed my mind, it needs to be something else
p = nullptr;
p = std::make_shared<Foo>(2);
return 0;
}
その出力は次のようになります。
Hi 1
Bye 1
Hi 2
Bye 2
それは不自然な例です。フーはかなり面白いです。それは単にその寿命に関する情報を表示します。
コードのロジックは次のとおりです。私はpを宣言しますが、最初に何をすべきかはわかりません。私はそれが何であるかを知っていることを決定します。それは価値1を取るべきです。私の実際のコードでは、この価値は長続きするかもしれません。
私はそれが1であってはならないと決めました。それは2でなければならないと決めました。それ以前にあったものはすべて破壊されなければなりません。
これまでのところ、私の理解では、上記のコードはメモリ管理の点で優れており、例外の下では堅牢です。
というのが多くの慣用的な方法があります:
p = nullptr;
p = std::make_shared<Foo>(2);
私は私が前に持っていたことは破壊する必要があることを言いたいので、私はちょうど、最後の行を書き込むことはできませんが。
_ "前に書いたものは破壊する必要があると言いたいので、最後の行を書くことはできません" _二番目の行'nullptr'を代入する以外の以前の値の破壊を引き起こさないでしょうか? –
私は "p = nullptr"をコメントアウトするとき、出力1、Hi 2、Bye 1、Bye 2を得るので、最初の割り当ては長すぎます。 – blippy
これは、** 2 **オブジェクトが 'p'への代入の前に作成されているためです。 ** 2 **を作成する前に** 1 **オブジェクトを本当に破壊する必要がある場合は、** 2 **を作成する前に 'p'を' nullptr'に設定する必要があります。それはあまりにも曖昧な要件なので、このためのイディオムはありません。 – Motti