1

削除コマンドが来るとクラッシュします。配列へのポインターを持つ構造体を作成し、乱数で埋めてから、メモリの割り当てを解除することになっています。for ループまたはブール値チェックなしでクラッシュする delete コマンドまで正常に動作します。

int main() {

    cout << "start" << endl;
    //Creating Struct
    struct 
    {
        int* ptrarray[10];
        bool boolarray[10];
    } data;

    //Initializing Random Generator
    srand ( time(NULL) );
    cout << "Initializing: ";

    //Allocating Memory and generating random numbers with for loops

    for (int i = 0; i < 10; i++)
    {   
        int counter = 0; //Counts numbers set   
        cout <<  i << " "; //Counting arrays initialized    
        data.ptrarray[i] = new int [12582912]; // Memory Allocation 

        for (int j = 0; j < 12582912; j++)//Number Generating
        {
            *data.ptrarray[i] = rand() % 899 + 100;
            data.ptrarray[i]++;
            counter++;
        }

        //Checking for failed initializations and declaring if success
        if (counter == 12582912)
        {
            data.boolarray[i] = true;
        }
        else
        {
            data.boolarray[i] = false;
        }
    }

    cout << endl;

    //This is where it always crashes.
    for (int i=0; i<10; i++)
    {
        if (data.boolarray[i] == true)
            delete[] data.ptrarray[i];
    }
    cout << endl;

    return 0;
}

MS Visual studio 2010 を使用しています。

4

3 に答える 3

2

犯人はこの行です:

data.ptrarray[i]++;

ポインターを変更してから、変更されたポインターを使用delete []しています。これは機能しません:delete[]から取得したのとまったく同じポインターを使用する必要がありますnew[]

試す

data.ptrarray[i][j] = rand() % 899 + 100;

代わりに、ポインターを変更する必要はありません。

于 2012-09-19T22:00:57.687 に答える
1

data.ptrarray[i]++;が問題です。

データへの参照をインクリメントしていますが、削除しようとする前に最初にリセットしていません。

于 2012-09-19T22:04:06.827 に答える
1

あなたの問題は次のとおりです。

data.ptrarray[i]++;

これはポインターを変更しています。その後、その変更されたポインターを解放しようとすると、クラッシュします。

これを解決するには、ポインターのコピーを使用して配列を実行するか、変数でインデックスを作成しjます。

data.ptrarray[i][j]
于 2012-09-19T22:02:29.823 に答える