これを行うとメモリリークが発生しますか?
はい、これによりメモリ リークが発生します。で割り当てられたすべてのオブジェクトは、で破棄するnew
必要がありますdelete
。そうしないと、メモリ リークが発生します。
特に、ここでベクトルに格納しているのは、で割り当てられたオブジェクトのコピーnew
です。コンテナに特定のクラスのオブジェクトを保持させたい場合は、次のようにするだけで十分です。
BaseClass::someFunction()
{
OtherClassName c;
theVector.push_back(c);
}
vector
C++ 標準ライブラリのすべてのコンテナと同様に、 には値のセマンティクスがあることに注意してください。これは、ベクトルに挿入するものがに渡すオブジェクトのコピーpush_back()
であることを意味します。元のオブジェクトにさらに変更を加えても、ベクトルに含まれるオブジェクトの状態には反映されません。その逆も同様です。
これを実現したい場合、つまり参照セマンティクスが必要な場合は、ベクターに (おそらくスマートな)ポインターを含める必要があります。例えば:
#include <memory>
// theVector would be declared as:
// std::vector<std::shared_ptr<OtherClassName>> theVector;
BaseClass::someFunction()
{
std::shared_ptr<OtherClassName> pC = std::make_shared<OtherClassName>();
theVector.push_back(pC);
}
手動によるメモリ管理は、メモリ リークや未定義の動作につながりやすく、堅牢性、読みやすさ、保守の容易さの点でプログラムの設計に悪影響を及ぼすため、Modern C++ では不適切なプログラミング手法new
とdelete
見なされています。