如何释放包含std::向量的对象的内存

How can I free memory of a object containing a std::vector

本文关键字:向量 对象 内存 std 包含 何释放 释放      更新时间:2023-10-16

在我当前正在处理的程序中,我有包含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++。我做错了什么吗?还是应该这样做?

我还尝试过使用不同的方法从析构函数中的"list"中释放内存,但由于"list"将超出范围,我想无论如何都应该释放它。

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

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

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

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

相关线程:Linux Allocator不释放小块内存,调用free或delete会将内存释放回"内存";系统";