Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我的程序会泄漏内存?(在C+;+;中使用树)_C++_Memory Leaks_Tree - Fatal编程技术网

C++ 为什么我的程序会泄漏内存?(在C+;+;中使用树)

C++ 为什么我的程序会泄漏内存?(在C+;+;中使用树),c++,memory-leaks,tree,C++,Memory Leaks,Tree,我正在创建一个动态对象树。Node类有一个向量来存储子节点,以及其他类变量: std::vector<Node*> child; std::向量子; 类析构函数删除所有动态分配的类变量,然后删除子节点: ~Node() { //Deleting the other variables . . . //Deleting the child nodes for(i

我正在创建一个动态对象树。Node类有一个向量来存储子节点,以及其他类变量:

std::vector<Node*> child;
std::向量子;
类析构函数删除所有动态分配的类变量,然后删除子节点:

~Node() {
    //Deleting the other variables
                .
                .
                .

    //Deleting the child nodes
    for(int i = 0; i < child.size(); i++) {
        delete child[i];
    }
}
~Node(){
//删除其他变量
.
.
.
//删除子节点
对于(int i=0;i
我的类有一个创建给定高度的树的方法,其中当前节点是根节点:

void createTree(int height) {
    if(height == 0) {
        return;
    }
    for(int i = 0; i < numberOfChildNodes; i++) {
        child.push_back(new Node());
        child[i]->createTree(height - 1);
    }
}
void createTree(整数高度){
如果(高度==0){
返回;
}
对于(int i=0;icreateTree(高度-1);
}
}
这个类有另一种方法,我创建一棵高度为3的树,然后删除整个树并创建另一棵高度为4的树,然后删除整个树并创建一棵高度为5的树,依此类推,直到达到内存限制:

void highestTreePossible() {
    int i, height = 3;
    struct sysinfo memInfo;
    while(true) {
        createTree(height);
        sysinfo (&memInfo);
        if(memInfo.freeram > limit) {
            std::cout << "Highest tree possible: height = " << height;
            break;
        }
        for(i = 0; i < child.size(); i++) {
            delete child[i];
        }
        child.clear();
        height++;
    }
    for(i = 0; i < child.size(); i++) {
        delete child[i];
    }
    child.clear();
}
void highesttreepobsible(){
int i,高度=3;
结构sysinfo memInfo;
while(true){
createTree(高度);
sysinfo(&memInfo);
如果(memInfo.freeram>限制){

std::cout它没有泄漏;您没有对这类事情使用有效的测试。现代操作系统有复杂的内存管理,您可能会观察到一个进程“保留”超过您在任何给定时间所需的内存。请放心,系统的其余部分在需要时都可以使用它


如果您关心内存,您需要观察进程在相当长的一段时间内消耗量的持续增长,或者连接到程序本身使用的实际分配器。一个很好的方法是使用诊断工具,如(如果您使用的是兼容系统)。有。

它没有泄漏;您没有对这类事情使用有效的测试。现代操作系统有复杂的内存管理,您可能会观察到一个进程“保留”超过您在任何给定时间所需的内存。请放心,系统的其余部分在需要时都可以使用它


如果您关心内存,您需要观察进程在相当长的一段时间内消耗量的持续增长,或者连接到程序本身使用的实际分配器。一个很好的方法是使用诊断工具,如(如果您使用的是兼容系统)。有。

如果您使用的是Linux系统,则可以尝试使用来可靠地检查代码是否存在内存泄漏

e.g.  $valgrind --leak-check=full ./node_test  
所以要回答“为什么我的代码会泄漏内存?”

当我使用valgrind报告测试/检查代码时,您的代码中没有内存泄漏(例如,“所有堆块都已释放——不可能有泄漏”)。 然而,我似乎注意到了包含退出条件的行中的一些问题
if(memInfo.freeram>limit)
,因为
memInfo.freeram
值预计会随着树的增长而减少。而您的目标是保持树的增长(因此
memInfo.freeram
也会缩小)正如您前面提到的“直到达到内存限制”,或者我重新表述的“直到
memInfo.freeram
低于某个限制”

因此我认为正确的退出条件应该是相反的
if(memInfo.freeram

希望这有帮助


另外,使用智能指针(例如std::unique_ptr、std::shared_ptr)来避免内存泄漏也是一种很好的做法。

如果您在Linux系统上,您可以尝试使用来可靠地检查代码是否存在内存泄漏

e.g.  $valgrind --leak-check=full ./node_test  
所以要回答“为什么我的代码会泄漏内存?”

当我使用valgrind报告测试/检查代码时,您的代码中没有内存泄漏(例如,“所有堆块都已释放——不可能有泄漏”)。 但是,我似乎注意到包含退出条件的行中存在一些问题
if(memInfo.freeram>limit)
,因为
memInfo.freeram
值预计会随着树的增长而减少。而您的目标是保持树的增长(因此
memInfo.freeram
也将收缩)”直到达到一个内存限制,“正如你上面提到的,或者”直到
memInfo.freeram
低于一个特定的限制“,正如我重新表述的那样

因此我认为正确的退出条件应该是相反的
if(memInfo.freeram

希望这有帮助


另外,使用智能指针(例如std::unique\u ptr、std::shared\u ptr)来避免内存泄漏也是一种很好的做法。

当我在运行该方法后检查内存时--如何进行此检查?请使用RAII模式(
std::unique\u ptr
)。如果“报告OS内存,然后测试无效。C++堆管理器足够智能地保存分配的内存。更好的测试是如果您连续调用这个函数,在某个类型的循环中重复1000次。如果您这样做了,请做“MeMeNo”。报告泄露内存增加率很高?C++内存管理器不一定会把内存返回给OS,因为程序有很大的可能性,程序要更多,从OS中分配是很昂贵的。当你检查RU后的内存时,你不会很快耗尽RAM,或者你的计算机是智能的,相信它:)。NeNo方法——如何使用此检查?请使用RAII模式(<代码> STD:UnQuyPPTR < /COD>)。如果这个“MEMFIONE”报告OS内存,那么您的测试无效。C++堆管理器是智能eNo。