1

当删除命令出现时崩溃。它应该用指向数组的指针创建一个结构,用随机数填充它们,然后释放内存。工作正常,直到删除命令,在没有 for 循环或布尔检查的情况下它与我们的崩溃。

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]++;

这是修改指针。然后,当您尝试释放该修改后的指针时,它会崩溃。

您可以通过使用指针的副本遍历数组来解决此问题,或者也可以通过使用j变量进行索引来解决此问题:

data.ptrarray[i][j]
于 2012-09-19T22:02:29.823 回答
1

data.ptrarray[i]++;是问题所在。

您正在增加对数据的引用,但在尝试删除它之前没有将其重置为开始。

于 2012-09-19T22:04:06.827 回答