Сбой программы при удалении массива указателей в структуре

Сбой, когда приходит команда удаления. Предполагается создать структуру с указателями на массивы, заполнить их случайными числами, а затем освободить память. Работает нормально до тех пор, пока не будет выполнена команда delete, в которой она завершается с нашей без цикла 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.

1

Решение

Виновником является эта строка:

data.ptrarray[i]++;

Вы меняете указатель, а затем используете delete [] на измененном указателе. Это не будет работать: вы должны использовать delete[] с точно таким же указателем, который вы получили от new[],

Пытаться

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

вместо этого вам не нужно менять указатель.

2

Другие решения

data.ptrarray[i]++; это проблема.

Вы увеличиваете свою ссылку на данные, но затем не сбрасываете их в начало, прежде чем пытаться удалить их.

1

Ваша проблема заключается в:

data.ptrarray[i]++;

Это изменение указателя. Когда вы затем пытаетесь освободить этот измененный указатель, он падает.

Вы можете решить эту проблему, используя копию указателя для запуска через массив, или индексируя с помощьюj переменная также:

data.ptrarray[i][j]
1
По вопросам рекламы [email protected]