Теоретически вы должны вызвать delete [].
РЕДАКТИРОВАТЬ: Следующее относится только к Microsoft Visual C ++ (я должен был это сказать).
На практике в Microsoft Visual C ++ не имеет значения, какое удаление вы используете, если у объектов в массиве нет деструкторов. Поскольку у вас есть массив указателей, а указатели не могут иметь деструкторов, все должно быть в порядке.
Однако, как указывали другие, в C ++ неправильно смешивать new [] и delete без []. Хотя в этом случае он может работать в Visual C ++, код не переносится и может не работать в других компиляторах.
Но возвращаясь к конкретному случаю Visual C ++, даже если вы вызовете delete [], компилятор поймет, что ему не нужно перебирать деструкторы вызова массива, когда это массив примитивных типов, таких как int, char или указатели. . Вызов delete в этом случае действительно работает и ничего не сломает. Было бы не медленнее поступить правильно и вызвать delete [], но и быстрее не будет.
Фактически, в MSVC ++ delete [] p немедленно вызывает обычный оператор delete (void * p), когда p является указателем на простой тип или тип без деструкторов.
Те, кто мне не верит, переходят через этот код в код CRT для первых двух вызовов delete [].
#include "stdafx.h"
#include <malloc.h>
#include <iostream>
using namespace std;
class NoDestructor
{
int m_i;
};
class WithDestructor
{
public:
~WithDestructor()
{
cout << "deleted one WithDestructor at " << (void *) this<< endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
int **p = new int *[20];
delete [] p;
p = (int**) malloc(80);
free(p);
NoDestructor *pa = new NoDestructor[20];
delete [] pa;
WithDestructor *pb = new WithDestructor[20];
delete [] pb;
return 0;
}
person
Carlos A. Ibarra
schedule
24.04.2009