私はいくつかのコードを生成するアプリケーションで作業していますが、速度は問題ではありませんが、メモリリークは望ましくありません。shared_ptr、vector、emplace_back、usage pointer outside
ガベージコレクタで他の言語から来たshared_ptrと少し混乱しています。
基本的には、すべてのポインタにshared_ptrを使用するとガベージコレクタと同様の動作をしますが、オブジェクトが参照されなくなったときにそのオブジェクトをremvoveするため、正しく理解しています。
shared_ptrのベクトルでemplace_backを使用するとどうなりますか。
void fun(MyObject* o){
std::vector<std::shared_ptr<MyObject>> v;
v.emplace_back(o);
}
今私は、ポインタを作成し、関数を呼び出す:
MyObject* o = new MyObject();
fun(o);
//Is o still here?
Oとどうなりますか、私はこの機能を持っているとしましょうか? emplace_backはどうにかして私の裸のポインタからshared_ptrを作成し、ベクトルが範囲外になるとoを削除しますか?
私は適切な方法が
EDIT ...そんなに悪くなります、私はもパフォーマンスが、コードに気をいけない場合、すべてをshared_ptrのためにあると思います。私は期待どおりに動作するかを理解します。私のアプリケーションのために、私は良い古い新しいと削除し、削除すると思います。アプリケーションは異なるノードを持つツリーであるため、最後にdeleteを呼び出すと、各子ノードを上から下に安全に削除する必要があります。
「shared_ptr everything」は**悪い考えです**。それでもメモリリークが発生する可能性があります。 –
「メモリリークが欲しくない」 'new'を使わないでください。いいえ、本当に。これはオブジェクトの作成を好むべき順序です: '(MyObject o;')を宣言するか、そうでない場合は 'std :: make_unique'を使用する、そうでない場合は' std :: make_shared' 。 – milleniumbug
良いプログラミング実践:生ポインタを渡すと、呼び出し元(関数)は、呼び出し元がオブジェクトの存続期間を担当していることと、呼び出しの存続期間が保証されている必要があります。あなたのコードはこれらのルールを両方破り、そのようなことがある場合、あなたは未定義の動作ゾーンにあなたのアプリケーションを置くことになります。 –