Cursor オブジェクト ポインターのベクトルがあるとします。カーソル オブジェクトは、単一の int パラメータで構築されます。では、この構文は機能しますか?
vector<cursor*> cursors;
cursors.push_back(new cursor(4));
または、次のようにする必要がありますか?
cursor* tempCursor = new cursor(4);
cursors.push_back(tempCursor);
あなたが述べているようにこれを行うと、メモリリークが発生し、後でクリーンアップしないでください。
より良い方法は、shared_ptr を使用することです。
コードは次のようになります
cursors.push_back(std::make_shared<cursor>(4));
ただし、何を達成しようとしているのかを正確に理解するのは少し難しいです。
以下の @cat-plus-plus によるコメントで述べられているように、オブジェクトを他の場所で共有することを明示的に望まない限り、unique_ptr を使用する必要があります。コードは次のようになります。
cursors.push_back(std::unique_ptr<cursor>(new cursor(4)));
これを試したことがないかもしれませんが、何が起こっているのかを説明します。
新しいカーソル オブジェクトを作成すると、新しいカーソル オブジェクトが返されます。push_back 関数を使用すると、オブジェクトがベクターにプッシュバックされます。したがって、push_back 内に新しいオブジェクトを作成すると、その関数が評価され、新しいカーソルが返され、それがプッシュバックされます。
基本的には、戻り値と評価がすべてです。
それは機能しますが、何か他のことをしたほうがよい可能性はかなりあります。それ以外の理由がない場合は、(カーソルへのポインターではなく)カーソルのベクトルにすることを検討します。この場合、次のようなことができます。
std::vector<cursor> cursors;
cursors.push_back(4); // or cursors.emplace_back(4);
これにより、通常、メモリ管理を自動化することでプログラマーの効率が向上し、不要なレベルの間接参照を排除することでコードの効率が向上します。