Write access violation при записи в динамический массив C++

379
22 января 2017, 15:20

Здравствуйте! Есть следующая проблема. Есть класс Упражнение_1 для домашней работы, в котором должны быть функции создания и инициализации динамического массива. Функции из описания класса:

public:
int Exercise_1:: createArray()
{
    int size_of_new_arr;
    cout << " Enter the size of the array: ";
    cin >> size_of_new_arr;
    array_ptr = new int[size_of_new_arr];
    return size_of_new_arr;
}
void Exercise_1::initializeArray(int* arrFI, int size)
{
    for (int i = 0; i < size; i++)
    {
        *(arrFI + i) = rand() % 100;
    }
}

Указатель и переменная в заголовочном файле:

public:
int* array_ptr;
int array_size;

В таком виде все работает нормально, Упражнение_1 корректно отрабатывает. Но если я переписываю первую функцию в следующем виде, то есть принимающую указатель из заголовочного файла как аргумент

public:
int Exercise_1:: createArray(int* arrForCreate) // << Принимает указатель 
{
    int size_of_new_arr;
    cout << " Enter the size of the array: ";
    cin >> size_of_new_arr;
    arrForCreate = new int[size_of_new_arr]; // << Выделяет  память
// Дальше ничего не меняется
    return size_of_new_arr;
}
void Exercise_1::initializeArray(int* arrFI, int size)
{
    for (int i = 0; i < size; i++)
    {
        *(arrFI + i) = rand() % 100;
    }
}

и потом вызываю ее

Exercise_1 exercise_1;
exercise_1.array_size = exercise_1.createArray(exercise_1.array_ptr); // Создаю массив
exercise_1.initializeArray(exercise_1.array_ptr, exercise_1.array_size);

то я получаю ошибку

Exception thrown: write access violation.

arrFI was 0x1110112.

Помогите разобраться что к чему. Вроде же я кардинально ничего не меняю, пытаюсь инициализировать по сути один и тот же указатель. Я хочу использовать эти функции в другом классе для создания и инициализации другого динамического массива, поэтому нужно, чтобы функция принимала указатель как параметр. Заранее спасибо!

П.С. Стаж С++ около 2.5 месяца, я в самом начале пути и пока очень мало знаю, учитывайте это при ответах

Answer 1

Обычная стандартная ошибка.

int Exercise_1:: createArray(int* arrForCreate) // << Принимает указатель 
{
...
    arrForCreate = new int[size_of_new_arr]; // << Выделяет  память
}

Итак, вы изменили arrForCreate - локальную копию указателя, переданного в функцию-член. Указатель-оригинал от этого не изменился...

Передавайте его как ссылку:

int Exercise_1:: createArray(int* &arrForCreate) 

И еще... Эти ваши функции - они для чего предназначены? чтобы работать с данными объекта? тогда зачем передавать их как параметры?

exercise_1.array_size = exercise_1.createArray(exercise_1.array_ptr);

Ваш createArray() должен работать со своими данными-членами:

void Exercise_1::createArray()
{
    cout << " Enter the size of the array: ";
    cin >> array_size;
    delete[] array_ptr;
    array_ptr = new int[array_size]; 
}

И вызываться просто и незатейливо:

exercise_1.createArray();

Естественно, в конструкторе array_ptr должен быть корректно инициализирован.

READ ALSO
#1054 - Unknown column &#39;&#39; in &#39;where clause&#39;

#1054 - Unknown column '' in 'where clause'

В sql не силён, составил запрос:

283
Сумма сумм в запросе

Сумма сумм в запросе

Есть такой запрос

303
Мне кажется, тут слишком много Активити

Мне кажется, тут слишком много Активити

Предположим, что у меня есть приложение, которое хранит информацию об объектах моего городаУ меня есть MainActivity, которая содержит в себе HomeFragment,...

352