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;
}

この関数は常に次のように使用されます。

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

valgrind私は最初の行でメモリをリークしていると言っています(Record* rec = new Record();)。なんで?

4

1 に答える 1

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;
}

後者の場合は、Record 全体がリークされているか (上記を参照)、そのデストラクタにバグがあることを意味します。ここでも、動的に割り当てられたメンバーをスマート ポインターに保持してみてください。

于 2013-06-27T09:02:09.910 に答える