Разница в способах удаления массива объектов - PullRequest
2 голосов
/ 10 октября 2010

Есть ли какая-нибудь разница в следующих удалениях массива объектов?

Первый способ:

MyClass **obj = new MyClass*[NUM];
for (int i=0; i<NUM; i++) obj[i] = new MyClass(val);
obj[0]->method();
for (int i=0; i<NUM; i++) delete obj[i]; /// Deletion1
delete obj;                              /// Deletion1

Второй способ:

MyClass **obj = new MyClass*[NUM];
for (int i=0; i<NUM; i++) obj[i] = new MyClass(val);
obj[0]->method();
delete[] obj;                            /// Deletion2
obj = 0x0;                               /// Deletion2

Оба способаработоспособны и похожи в отладчике.

Ответы [ 2 ]

4 голосов
/ 10 октября 2010

Оба неверны.Правильный путь будет следующим:

for (int i = 0; i < NUM; i++) delete obj[i];
delete[] obj;

В первом показанном вами способе вы используете delete для уничтожения объекта, выделенного с помощью new[], что приводит к неопределенному поведению (если вы используете new[]Вы должны уничтожить объект, используя delete[]).

Во втором показанном способе вы пропускаете все указатели, которые вы создали в первом цикле for.

Если вы используете std::vector вместо динамически размещаемых массивов и некоторого типа интеллектуальных указателей, вам не нужно беспокоиться об этом в большинстве кода.

3 голосов
/ 10 октября 2010

В первом примере вы явно вызываете деструктор для каждого объекта, на который указывают члены выделенного массива. Затем вы удаляете массив указателей (который на самом деле должен быть delete[], потому что вы выделили его как массив, но на практике для этого примера это, вероятно, не имеет значения).

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

Если вы создадите массив объектов , а не указателей , например:

MyClass *obj = new MyClass[NUM];

тогда оператор delete[] автоматически вызовет деструктор для каждого из NUM объектов в выделенном массиве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...