0

在我目前正在处理的程序中,我有包含std::vectors. 当我尝试删除这些对象时出现问题,没有从对象中释放内存。

我做了一个最小的程序来测试它,也不能让它在这个程序中正常工作。

这是我用来测试的程序。

#include<iostream>
#include<vector>

struct node{

    std::vector<int> list;

    bool isParent;
    struct node* child;

    ~node(){
        delete[] child;
    }

    node(){
        isParent = false;
        list.push_back(5); // comenting this line would make it work correctly
    }

    void divide_r(){
        if (isParent){
            for(int i = 0; i < 8; i++){
                (child+i)->divide_r();
            }
        }else{
            node *c;
            c = new node[8];
            child = &c[0];
            isParent = true;
        }
    }
};

int main(){


    node *root = new node;

    for(int i = 0; i < 8; i++){
        root->divide_r();
    }

    delete root;

    sleep(10);

    return 0;
}

因此,如果我将任何内容推入向量中,我将无法释放任何内存。

如果这很重要,我在 ubuntu 上使用g++ 。我做错了什么还是应该这样做?

我还尝试使用不同的方法从析构函数中的“列表”中释放内存,但由于“列表”会超出范围,我猜它应该被释放。

该程序将使用大约 1.4GB 的 RAM,但在睡眠和程序退出之前没有任何内容被释放。

4

1 回答 1

2

尝试分配您的对象,然后删除它们。当您分配新对象时,您会注意到操作系统并未显示内存使用量增加。

您也可以通过 valgrind 运行您的示例,并且您应该注意到,它不会抱怨内存泄漏。

原因很明显。C 库希望避免调用操作系统来分配和返回每一小块内存的额外开销。

相关线程:Linux 分配器不会释放小块内存调用 free 或 delete 是否曾经将内存释放回“系统”

于 2013-06-28T15:14:54.553 回答