2011-01-12 8 views
0

私は、intの配列を指すポインタの配列を持っています。 私はハードコードされたint配列を作成しました(下の '配列'をチェックしてください)、ポインタの配列に挿入したいと思います。 intの配列を指しています。動的に割り当てられたギザギザの配列を削除する

コンパイルは正常です。警告なし。 正常に動作します。そしてうまく閉じます。 少なくとも、現在コメントされている削除文をデストラクタに導入しています。

この時点で私のコンパイラがより良いデストラクタを作ってくれると想像していますが、私が間違っていることに興味があります。ターミナルウィンドウは巨大なメモリマップを投げるだけです。グーグルと検索することはあまり役に立たなかった。

class foo { 
    public: 
    int **bar; 
    int aSize; 

    //CONSTRUCTOR 
    foo(int aSize) { 
     this->aSize = aSize; 
     bar = new int*[aSize]; 
     for (int i=0;i<aSize;i++) { 
      bar[i] = new int[aSize + i]; 
      for (int j=0;j<(aSize + i);j++) { 
       bar[i][j] = 0; 
      } 
     } 
     } 
    void myfunc(int *pointer) { 
     bar[0] = pointer; 
    } 
    ~foo() { 
     for (int i=0;i<aSize;i++) { 
      //delete[] bar[i]; 
     } 
     delete[] bar; 
    } 
}; 
int main() { 
    foo *obj = new foo(5); 

    int array[] = {1,2,3,4}; 

    obj->myfunc(array); 

    delete obj; 
    return 0; 
}; 

私は恐らく何か悲劇的なことをしたことは知っています。私はまだそれが何であるかを知らない。 STLやその他のテンプレートを使用していない理由があります。これは単にこれを学ぶことに興味があるからです。 最大の批判をいただきました。

答えて

3

myfunc関数はポインタを取り込み、そのメモリアドレスにbar[0]を設定します。あなたのコード例では、アドレスに自動(スタック)変数であるarrayのアドレスを渡します。次にデストラクタはdelete[] bar[0]を試み、スタック変数を指しています。これは完全にundefined behaviorであり、プログラムがクラッシュする理由です。スタック配列delete[]できません。配列delete[]new[]を使用して割り当てられた配列のみです。 はヒープ割り当て配列を指すため、myfunc関数は常にメモリをリークします。 barを先のアドレスが最初にdelete[]なしで別のメモリアドレスに設定すると、メモリがリークしています。

+0

ちょっと、明らかな答え...暑い天気。ありがとう。 int i = 0からi = 1に変更しました。 – dcousens

+2

暑いですか? [あなたを羨ましい](http://www.weather.com/weather/today/New+York+NY+USNY0996?from=search_city "私はあなたを羨ましい") –

+0

配列の削除は[]のみできます'new'ではなく' new [] 'を使って割り当てられます。マイナーニット。 – Puppy

1

問題はmyfuncです。その関数では、クラスが所有していると考えるポインタ(bar[0])を置き換えます。あなたのobjデストラクタは、その結果、array[]のにdelete[]を実行しようとします。これはおそらく、あなたのクラッシュを引き起こします。は元のままになりますbar[0]

関連する問題