Удаление массива в деструкторе класса

0

У меня есть класс NameClass с членами:

class NameClass {
    public:

    int count;
    apple* array;
} 

и конструктор этого:

NameClass::NameClass()
{
    count = 12;
    array = new apple[count];
    ...
}

Должен ли я удалить этот массив в деструкторе класса? И как?

Это приводит к ошибке ("освобождение указателя не было выделено"):

delete []apple;
or 
delete apple;
  • 0
    delete[] array;
  • 5
    Используйте std::vector .
Показать ещё 6 комментариев
Теги:
arrays
memory-management

2 ответа

2
Лучший ответ

delete []array; должна быть правильная операция удаления, используемая в деструкторе.

Если вы получили сообщение об ошибке

"Это делает ошибку (" освобождение указателя не было выделено "):"

вы либо пропустили, чтобы правильно инициализировать array с помощью nullptr (или NULL), либо передали ему адрес нераспределенной памяти (например, эталонная ссылка).

  • 0
    @ Владислав Обратите внимание, что именно я говорю (обновлено), Xcode не имеет значения ИМХО.
  • 0
    Я написал этот array = nullptr; delete array; в деструкторе, и это работает, но я не уверен, что это правильно.
Показать ещё 3 комментария
1

delete []apple; не будет компилироваться, но вы, очевидно, имеете ошибку времени выполнения, поэтому вы должны иметь delete []array; , Прежде всего, это правильно!

Предполагая, что ваш класс NameClass к тривиальному, причиной ошибки может быть то, что два из ваших объектов NameClass имеют указатель на array который указывает на тот же массив. Это может произойти, если ваш класс не имеет определяемого пользователем конструктора копирования и/или оператора присваивания, и в этом случае компилятор будет генерировать его для вас. Если вы сделаете что-то подобное

NameClass n1;
NameClass n2 = n1;

или

NameClass n1;
NameClass n2;
n2 = n1;

в вашем коде компилятор будет просто назначать все члены (включая указатель array) друг другу, делая array указывать на одну и ту же часть памяти в обоих объектах (а в последнем случае вызывает утечку памяти для памяти вначале выделенных в конструкторе n2). Что вам нужно сделать, так это определить конструктор копирования и оператор присваивания, чтобы они сделали копию массива, на который указывает array. Поскольку все, что вы делаете в деструкторе, в конструкторе копирования и в операторе присваивания копии (и в конструкторе, но это очевидно), должны быть совместимы друг с другом, это называется Правилом трех.

  • 0
    Правило трех очень хорошее упоминание здесь!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню