0

intの配列を指すポインターの配列があります。ハードコードされたintの配列(下の「array」をチェック)を作成し、それをポインターの配列(下の「bar」をチェック)に挿入したいのですが、私が知る限り、それはまだポインターの配列です。 intの配列を指します。

正常にコンパイルされます。警告はありません。正常に動作します。正常に閉じます。少なくとも、現在コメント化されているdeleteステートメントをデストラクタに導入します。

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

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や他のテンプレートを使用していないのには理由があります。それは単にこれを学びたいからです。最大の批判を歓迎します。

4

2 に答える 2

3

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

また、ヒープに割り当てられた配列を指しているmyfuncため、関数は常にメモリ リークを起こします。最初に前のアドレスを ingせずに別のメモリ アドレスにbar[0]設定すると、メモリ リークが発生します。bardelete[]

于 2011-01-12T07:42:50.637 に答える
1

問題は呼び出しmyfuncです。bar[0]その関数では、クラスが所有していると考えるポインター ( ) を置き換えています。objその結果、デストラクタはinで実行しようとdelete[]します。これにより、おそらくクラッシュが発生、元のぶら下がりが残ります。array[]mainbar[0]

于 2011-01-12T07:41:57.750 に答える