2014-11-21 3 views
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'. – chris

+0

@chris Ты знаешь, что это домашнее задание. – mostruash

ответ

2

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

Если вы получаете ошибки, как упоминалось

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

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

+0

@ Vladislav Обратите внимание, что я говорю (обновлено), Xcode не имеет никакого значения ИМХО. –

+0

Я написал это 'array = nullptr; delete array; 'in destructor и он работает, но я не уверен, что это правильно. – Vladislav

+0

@ Vladislav _ "Я написал это' array = nullptr; delete array; '" _ Это всегда должно работать. Хотя, если вы используете 'new []' для выделения, вам понадобится 'delete []' как кулон. Просто 'delete' приводит к неопределенному поведению. –

1

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

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

NameClass n1; 
NameClass n2 = n1; 

или

NameClass n1; 
NameClass n2; 
n2 = n1; 

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

+0

_Rule of Three_ - очень хорошее упоминание здесь! –

Смежные вопросы