po dyskusji na spotkaniu oprogramowania Postanowiłem dowiedzieć się, czy usunięcie dynamicznie przydzielonej tablicy prymitywów ze zwykłym delete
spowoduje wyciek pamięci.Czy usuń p gdzie p jest wskaźnikiem do tablicy zawsze wyciek pamięci?
Pisałem ten mały program i skompilowany z visual studio 2008 działa na 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;
}
}
ja niż monitorować zużycie pamięci mojej aplikacji przy użyciu menedżera zadań, zaskakująco pamięć została przydzielona i zwolniona poprawnie , przydzielona pamięć nie stale zwiększać jak oczekiwano
I zostały zmodyfikowane mój program testowy, aby przydzielić non prymitywny typ tablicy:
#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;
}
}
po uruchomieniu przez 10 minut nie było znaczącego zwiększenia pamięci
Przygotowałem projekt z ostrzeżeniem na poziomie 4 i nie otrzymałem ostrzeżeń.
Czy możliwe jest, że czas pracy studia wizualnego będzie śledzony dla przydzielonych typów obiektów, więc nie ma różnicy między delete
i delete[]
w tym środowisku?
Duplikat? http://stackoverflow.com/questions/1913343/how-could-pairing-new-with-delete-possibly-lead-to-memory-leak-only –
@Philip Potter: Nie z tego samego pytania - ten jest specjalnie o powodowaniu wycieku pamięci. A przeciek pamięci nie jest typowy w tym przypadku. – sharptooth
Wypróbuj go z tablicą 'shared_ptr', wskazując na inną przydzieloną int, a zobaczysz, czy twoja implementacja czyni równoważnik "delete" i "delete []". Zawsze ta fascynacja C++ rzeczami, które ludzie wiedzą, są złe, są wyraźnie określone w standardzie, aby być błędnym, a jednak wyglądają tak, jakby mogły czasem po prostu zadziałać ;-) –