Теоретически вы должны вызвать delete [].
РЕДАКТИРОВАТЬ: Следующее относится только к Microsoft Visual C ++ (я должен был сказать это).
На практике в Microsoft Visual C ++ не имеет значения, какое удаление вы используете, когда у объектов в массиве нет деструкторов. Поскольку у вас есть массив указателей, а указатели не могут иметь деструкторов, вы должны быть в порядке.
Однако, как отмечали другие, неправильно смешивать в C ++ new [] и удалять без []. Хотя в этом случае он может работать в 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;
}