siguiendo una discusión en una reunión de software que he establecido para averiguar si eliminar una matriz de primitivas dinámicamente asignadas con delete
llano causará una pérdida de memoria.¿Eliminar p, donde p es un puntero a la matriz siempre una pérdida de memoria?
He escrito este pequeño programa y compilado con Visual Studio 2008 que se ejecuta en Windows XP:
#include "stdafx.h"
#include "Windows.h"
const unsigned long BLOCK_SIZE = 1024*100000;
int _tmain()
{
for (unsigned int i =0; i < 1024*1000; i++)
{
int* p = new int[1024*100000];
for (int j =0;j<BLOCK_SIZE;j++) p[j]= j % 2;
Sleep(1000);
delete p;
}
}
I que monitoriza el consumo de memoria de mi solicitud usando el administrador de tareas, es sorprendente que la memoria se asigna y se liberó correctamente , memoria asignada no aumentó de manera constante como se esperaba
he modificado mi programa de pruebas para asignar una matriz de tipo primitivo no:
#include "stdafx.h"
#include "Windows.h"
struct aStruct
{
aStruct() : i(1), j(0) {}
int i;
char j;
} NonePrimitive;
const unsigned long BLOCK_SIZE = 1024*100000;
int _tmain()
{
for (unsigned int i =0; i < 1024*100000; i++)
{
aStruct* p = new aStruct[1024*100000];
Sleep(1000);
delete p;
}
}
después de ejecutar durante 10 minutos no hubo un aumento significativo en la memoria
Compilé el proyecto con el nivel de advertencia 4 y no recibí ninguna advertencia.
¿es posible que el tiempo de ejecución del estudio visual realice un seguimiento de los tipos de objetos asignados para que no haya diferente entre delete
y delete[]
en ese entorno?
¿Duplicado? http://stackoverflow.com/questions/1913343/how-could-pairing-new-with-delete-possibly-lead-to-memory-leak-only –
@Philip Potter: No de esa misma pregunta, esa es específicamente acerca de causar una pérdida de memoria. Y la pérdida de memoria no es típica en este caso. – sharptooth
Pruébalo con una matriz de 'shared_ptr', cada uno apuntando a una int diferente asignada, y verás si tu implementación está haciendo 'delete' y' delete [] 'equivalent. Siempre esta fascinación en C++ con cosas que las personas saben que están equivocadas, están claramente establecidas en el estándar como incorrectas, y que a pesar de todo parecen como si a veces funcionaran ;-) –