PDA

View Full Version : [C++] _CrtDumpMemoryLeaks


tomminno
04-04-2008, 13:36
Come mai questa funzione riconosce come memory leak le stringhe costanti?

71104
04-04-2008, 14:27
è un evidente controsenso, mica puoi buttarci lì così una domanda del genere :D
devi dirci tutto il resto; ad esempio, sicuro che i leak indicati si riferissero proprio alle aree di memoria contenenti gli string literals e non invece magari a blocchi allocati nell'heap nel quale tu hai poi ricopiato dei literals (lstrcpy o chi per lei)?

PS: a volte mi dispiace di essere pigro: se non lo fossi avrei già buttato giù due righe di codice per una verifica diretta.

tomminno
04-04-2008, 15:09
è un evidente controsenso, mica puoi buttarci lì così una domanda del genere :D
devi dirci tutto il resto; ad esempio, sicuro che i leak indicati si riferissero proprio alle aree di memoria contenenti gli string literals e non invece magari a blocchi allocati nell'heap nel quale tu hai poi ricopiato dei literals (lstrcpy o chi per lei)?

PS: a volte mi dispiace di essere pigro: se non lo fossi avrei già buttato giù due righe di codice per una verifica diretta.

Ho indagato un pò e ho visto che dà memory leak per tutte le stringhe che corrispondono ad un URL ben formata!


int main()
{
string out0 = "http://www.google.it/";
string out1 = "http://google";
string out2 = "www.google.it";
string out3 = "http://hwupgrade.it";
cout << out0 << endl << out1 << endl << out2 << endl << out3;
_CrtDumpMemoryLeaks();
return 0;
}


Questo codice termina miseramente la sua esecuzione con il seguente messaggio:


Detected memory leaks!
Dumping objects ->
{69} normal block at 0x00D81230, 32 bytes long.
Data: <http://hwupgrade> 68 74 74 70 3A 2F 2F 68 77 75 70 67 72 61 64 65
{68} normal block at 0x00D811D0, 32 bytes long.
Data: <http://www.googl> 68 74 74 70 3A 2F 2F 77 77 77 2E 67 6F 6F 67 6C
Object dump complete.


:muro:

71104
04-04-2008, 16:32
due osservazioni:

1) non è assolutamente detto che il dump riporti i dati dello string literal; piuttosto riporterà quelli dei buffer interni degli oggetti string (che ti avevo detto? :))

2) vengono riportati come leak i buffers interni degli oggetti string per un motivo che a me sembra palese: per come funziona std::string essi devono essere allocati dinamicamente, e siccome quegli oggetti non sono ancora stati distrutti (non sono ancora usciti fuori scope) i buffers risultano ancora allocati.

prova così:

int main()
{
{
string out0 = "http://www.google.it/";
string out1 = "http://google";
string out2 = "www.google.it";
string out3 = "http://hwupgrade.it";
cout << out0 << endl << out1 << endl << out2 << endl << out3;
}
_CrtDumpMemoryLeaks();
return 0;
}

Albi89
04-04-2008, 23:36
Mi permetto di "rubare" questo topic: non uso il Visual C++ e di conseguenza non ho a disposizione questa funzione.
Non esiste per windows qualche software come valgrind per controlare ad esempio che la deallocazione delle variabili dinamiche sia eseguita correttamente?
Grazie per le dritte ;)