2013-06-27 208 views
0
Record* MyClass::get_record (int id) 
{ 
    Record* rec = new Record(); 
    Record* compressed_rec; 

    /* ... code that gets compressed_rec into memory ... */ 

    compressed_rec->decompress(rec); 

    return rec; 
} 

此功能總是像這樣使用:Valgrind的內存泄露

Record* rec = my_class_instance.get_record (id); 
show_contents_of(rec); 
delete rec; 

valgrind說,我在第一行(Record* rec = new Record();)泄漏內存。爲什麼?

+0

代碼中被剪切的是什麼? – hmjd

+0

要麼是假陽性,要麼是其他地方有泄漏。 – juanchopanza

+1

關於內存泄漏我會信任valgrind,並說你有一個代碼路徑,它不會刪除內存(例如通過異常)。由於缺乏這麼多的代碼,我們不能告訴你更多,但猜測。並想知道爲什麼你不使用智能指針,這可能會解決問題... – PlasmaHH

回答

0

valgrind說我在第一行泄漏內存(Record * rec = new Record();)。爲什麼?

是否顯示Record本身被泄漏,或其他內部分配Record::Record

如果前者,無論是一些返回路徑從MyClass::get_record泄漏它,或來電泄漏它。切換到使用智能指針會解決這兩種情況下:

std::unique_ptr<Record> MyClass::get_record (int id) 
{ 
    std::unique_ptr<Record> rec(new Record()); 
    ... 
    return rec; 
} 

如果是後一種情況下,要麼意味着整個記錄被泄漏(見上文),或它的析構函數是馬車。再次嘗試在智能指針中保留任何動態分配的成員。