2

このコードが原因でメモリ リークが発生していますが、その理由はわかりません。

[編集] hereからのコードを問題に含めました:

#include "src/base.cpp"

typedef std::map<std::string, AlObj*, std::less<std::string>, 
  gc_allocator<std::pair<const std::string, AlObj*> > > KWARG_TYPE;

AlInt::AlInt(int val)   {
    this->value = val;
    this->setup();
}

// attrs is of type KWARG_TYPE
void AlInt::setup() {
    this->attrs["__add__"] = new AddInts();
    this->attrs["__sub__"] = new SubtractInts();
    this->attrs["__mul__"] = new MultiplyInts();
    this->attrs["__div__"] = new DivideInts();
    this->attrs["__pow__"] = new PowerInts();
    this->attrs["__str__"] = new PrintInt();
}

int main() {
    while (true) {
        AlObj* a = new AlInt(3);
    }
}

AlInt は AlObj を継承し、AlObj は gc を継承します。setup() の内容をコメントアウトすると、メモリリークは発生しません。これにより、問題はマップがクリーンアップされていないことにあると思われますが、gc アロケーターを使用しているため、よくわかりません次にどこを見るか。考え?

4

2 に答える 2

4

'gcアロケータ'は、このタイプのオブジェクトを割り当てて管理しています。

std::pair<const std::string, AlObj*>

このオブジェクトにポインタが含まれているからといって、アロケータがそのオブジェクトに対してdeleteを呼び出すことを意味するわけではありません。

setUp()で作成されたオブジェクトをGCにする場合は、GCを介してそれらを割り当てる必要があります。または、boost:ptr_mapまたはshared_ptrの使用方法を学びます。

マップは、所有しているオブジェクトを破棄します(削除しません)。この場合、ポインタが指すものではなく、ポインタを所有します。したがって、マップが破棄されると、マップとそれが所有するオブジェクトに関連付けられているすべての割り当てが解除されます(ポインターの場合、これは何もしないことを意味します)。

ポインタを含むマップ(または他のコンテナ)がある場合。ポインタを手動で削除する必要があります。そうしないと、メモリリークが発生します。または、boost::ptr_mapまたはshare_ptrを含むマップを使用できます

于 2008-11-15T19:12:48.123 に答える
0

アロケーターがペアを削除しています。ただし、ペアを削除しても、たまたまポインターであるペアのメンバーは削除されません。

于 2008-11-16T06:59:26.263 に答える