En teoría, debe llamar a eliminar [] .
EDIT:. El siguiente se aplica sólo a Microsoft Visual C++ (que debería haber dicho esto)
en la práctica, en Microsoft Visual C++, no importa lo que elimina utiliza cuando los objetos en la matriz no tiene destructores. Como tiene una matriz de punteros y los punteros no pueden tener destructores, debería estar bien.
Sin embargo, como han señalado otros, es incorrecto C++ mezclar nuevo [] y eliminar sin []. Aunque puede funcionar en Visual C++ en este caso, el código no es portátil y puede fallar en otros compiladores.
Pero volviendo al caso específico de Visual C++, incluso si llama a delete [], el compilador se dará cuenta de que no necesita iterar a través de la matriz llamando a destructores cuando se trata de una matriz de tipos primitivos como int, char, o punteros. Llamar a eliminar en ese caso realmente funciona y no romperá nada. No sería más lento hacer lo correcto y llamar a eliminar [], pero tampoco será más rápido.
De hecho, en MSVC++, eliminar [] p llama inmediatamente al operador normal delete (void * p) cuando p es un puntero a un tipo simple, o uno sin destructores.
Aquellos que no me crean, recorran este código en el código CRT para las primeras dos llamadas para eliminar [].
#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;
}
Gracias por resumir el hilo muy bien :) – RnR
Como nota adicional, si uno realmente quiere realmente hacerlo No tener esa sobrecarga, un enfoque portátil sería usar malloc() y free() en lugar de new [] y eliminar [] – bdonlan