Сбой, когда приходит команда удаления. Предполагается создать структуру с указателями на массивы, заполнить их случайными числами, а затем освободить память. Работает нормально до тех пор, пока не будет выполнена команда 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.
Виновником является эта строка:
data.ptrarray[i]++;
Вы меняете указатель, а затем используете delete []
на измененном указателе. Это не будет работать: вы должны использовать delete[]
с точно таким же указателем, который вы получили от new[]
,
Пытаться
data.ptrarray[i][j] = rand() % 899 + 100;
вместо этого вам не нужно менять указатель.
data.ptrarray[i]++;
это проблема.
Вы увеличиваете свою ссылку на данные, но затем не сбрасываете их в начало, прежде чем пытаться удалить их.
Ваша проблема заключается в:
data.ptrarray[i]++;
Это изменение указателя. Когда вы затем пытаетесь освободить этот измененный указатель, он падает.
Вы можете решить эту проблему, используя копию указателя для запуска через массив, или индексируя с помощьюj
переменная также:
data.ptrarray[i][j]