簡體   English   中英

使用Boehm GC時C ++中的內存泄漏的原因

[英]Cause of a memory leak in C++ when using the Boehm GC

這段代碼對我造成了內存泄漏,我不確定為什么。

[編輯] 此處包含的代碼有疑問:

#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,而后者又繼承自gc。 當我注釋掉setup()的內容時,沒有內存泄漏,這使我相信問題在於映射未清除,但是我正在使用gc分配器,因此我不確定接下來要看的地方。 思考?

“ gc分配器”正在分配和照顧這種類型的對象:

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

僅僅因為該對象中有一個指針並不意味着它會在分配器上調用delete。

如果要將setUp()中創建的對象作為GC,則需要通過GC分配它們。 或學習使用boost:ptr_map或shared_ptr。

映射會銷毀(而不是刪除)其擁有的對象。 在這種情況下,它擁有指針, 而不是指針指向的指針。 因此,在銷毀地圖時,它會取消分配與地圖及其所擁有的對象關聯的所有內容(對於指針,這意味着它什么也不做)。

如果您有一個包含指針的地圖(或其他容器)。 您必須手動刪除指針,否則會發生內存泄漏。 或者,您可以使用boost :: ptr_map或包含share_ptr的地圖

實質上,我要說的是,AlObj似乎已被破壞,但不是它的成員(因為除非我將內容放入attrs,否則它不會泄漏)。

分配器正在刪除您的貨幣對。 但是刪除一對並不會刪除恰好是指針的一對成員。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM