2

vector<OtherClassName> theVectorだから私はのメンバーとして持っていたいですBaseClass

メモリリークが発生する可能性があると多くの点で疑問に思っています...

これを行うとメモリリークが発生しますか?

BaseClass::someFunction(){
   OtherClassName * c = new OtherClassName();
   theVector.push_back((*c));
}

私は C++ の初心者で、インターネットから学んでいます。

4

2 に答える 2

1

これを行うとメモリリークが発生しますか?

はい、これによりメモリ リークが発生します。で割り当てられたすべてのオブジェクトは、で破棄するnew必要がありますdelete。そうしないと、メモリ リークが発生します。

特に、ここでベクトルに格納しているのは、で割り当てられたオブジェクトのコピーnewです。コンテナに特定のクラスのオブジェクトを保持させたい場合は、次のようにするだけで十分です。

BaseClass::someFunction()
{
    OtherClassName c;
    theVector.push_back(c);
}

vectorC++ 標準ライブラリのすべてのコンテナと同様に、 には値のセマンティクスがあることに注意してください。これは、ベクトルに挿入するものがに渡すオブジェクトのコピー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++ では不適切なプログラミング手法newdelete見なされています。

于 2013-03-27T19:20:32.890 に答える
0

何かを動的に作成するクラスには、オブジェクトが破棄されたときにメモリを解放するデストラクタが必要です。持っていない場合は、メモリ リークが発生しています。新しいステートメントによって使用されるメモリには、対応する削除ステートメントが必要です。そうしないと、メモリ リークが発生します。あなたのクラスは今書かれているので、メモリを再び解放することはないので、メモリリークが発生します。デストラクタは単純にベクトルを調べて、格納されているすべてのポインタからメモリを解放する必要があります。

于 2013-03-27T19:24:43.190 に答える