ホーム>source

というクラスを想定しますVec  arr というベクトルが存在するそれは唯一のメンバーなので。次のコードはメモリをリークしません。 (これは、Vecのデストラクタが期待どおりに機能していることを意味します。)

ウィズウィズ

ただし、次のコードでは、です メモリリーク。しかし、なぜ?私はウィズウィズを持っているようです int main() { Vec *obj = new Vec(5); // initializes a vector of size 5 delete obj; } を使用するたびに 。何が欠けていますか?

ウィズウィズ

PS:valgrindを使用してメモリリークをチェックしました。

delete
あなたの答え
  • 解決した方法 # 1

    範囲。

    ウィズウィズ   Vec* obj = new Vec(6); という名前の新しい変数を作成します   obj 内にのみ存在する の体と if を非表示にします  外側のスコープで。内側の obj   範囲外になり、 obj の最後に消えます の本文。その新しい割り当てへの最後のポインタを取得します。その後、コードは再 if s delete  外側のスコープで(良いことではありません)。

    解決:

    ウィズウィズ
    

  • 解決した方法 # 2

    if条件内で宣言されたVec * objが別のスコープ内にあります。 main()の先頭で宣言したVec *オブジェクトを指しているスコープの外側で別の削除を実行しています。 したがって、条件がメモリリークである場合にVec配列が内部に割り当てられます

  • 解決した方法 # 3

    あなたが obj と言うとき  もう一度、 int main() { Vec* obj; obj = new Vec(5); if (true) { delete obj; obj = new Vec(6); // re-uses the original obj } delete obj; } の代わりに 、古い変数を更新するのではなく、シャドウします。その結果、2番目の Vec* obj = をリークします。 、さらに悪いことに、あなたは最初のものをダブルフリーにします。

  • 解決した方法 # 4

    条件ステートメントの「Vec *」を削除すると、メモリリークが修正されます。条件付きでVec型(たまたまobjとも呼ばれます)の新しいポインターを定義していて、そのメモリを解放することはありません。 2番目の「obj」は条件の最後で削除されずにスコープ外になるため、両方の「delete」は最初の「obj」を参照します。

    obj =

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ Rでテーブルスタイルのようなリストを表示する方法