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

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


person James P    schedule 19.09.2012    source источник
comment
Это ужасное форматирование. Пожалуйста, переформатируйте и вставьте в gist.   -  person BSull    schedule 20.09.2012


Ответы (3)


Виной всему такая строчка:

data.ptrarray[i]++;

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

Пытаться

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

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

person nneonneo    schedule 19.09.2012
comment
Хотя немного медленнее. Если компилятор не оптимизирует это. - person BSull; 20.09.2012
comment
Большинство современных компиляторов достаточно умны, чтобы распознать цикл заполнения массива for(x=0; x<n; x++) arr[x] = f(x); и создать соответствующую временную переменную. - person nneonneo; 20.09.2012
comment
Большое спасибо (и всем, кто видел ошибку). Теперь это имеет смысл. - person James P; 20.09.2012
comment
Ну ладно. Удаляет сейчас нормально. (Я удалил data.ptrarray [i] ++; и заменил * data.ptrarray [i] = rand ()% 899 + 100; на data.ptrarray [i] [j] = rand ()% 899 + 100;) Но теперь он не печатает правильный диапазон целых чисел, а вместо этого выводит некоторые дикие числа (отрицательные, 0, намного больше 1000). Любые идеи? - person James P; 20.09.2012
comment
Хорошо, забудьте об этом, мне также пришлось изменить функцию печати в моем расширенном коде. Спасибо еще раз. - person James P; 20.09.2012

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

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

person Community    schedule 19.09.2012

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

data.ptrarray[i]++;

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

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

data.ptrarray[i][j]
person paxdiablo    schedule 19.09.2012