0

嗨,我有以下代码,它将节点从 slaveQueue 和 preload 带到 preload1 和 preload2,但内存总是在增加。我认为它应该在我调用 dfs 后释放,因为在本地函数返回后应该释放所有内存,并且我检查了 pop() 函数是否也会释放内存?所以我想知道我的内存泄漏在哪里?谢谢

    queue<Graphnode> *preload1 = new queue<Graphnode>;
    queue<Graphnode> *preload2 = new queue<Graphnode>;
    for(int n = windowWidth; n > 0; n--)
    {
        if((*slaveQueue).empty())
        {
            //cout <<"fffffffffffff"<<endl;
            break;
        }
        (*preload2).push((*slaveQueue).front());
        //cout << (*slaveQueue).size()<<endl;
        (*slaveQueue).pop();
    }
    int preload1No =0;

    while(!(*preload2).empty())
    {
        preload1No++;
        *slaveroot = (*preload2).front();
        (*preload2).pop();
        if(!(*slaveQueue).empty())
        {
            (*preload2).push((*slaveQueue).front());
            (*slaveQueue).pop();
        }
        dfs(*slaveroot,goal,totalDepth,*preload1,*preload2,checkfile);
        if(preload1No>windowWidth)
        {
            (*preload1).push(*slaveroot);
            (*preload1).pop();
        }
        else
        {
            (*preload1).push(*slaveroot);
        }
        cout<<(*preload1).size()<<"\t"<<(*preload2).size()<<endl;
    }
    delete slaveroot;
    delete preload1;
    delete preload2;
    delete slaveQueue;
4

6 回答 6

2

是的,它会复制指针a,但不会复制指向的内存a。所以这里没有内存泄漏,因此没有什么可以释放的。

于 2013-02-15T17:49:53.910 回答
1

如果您没有在 中显式分配任何内存func1,并且没有调用执行此操作的函数,则没有内存泄漏。您复制到函数中的只是一个指针。复制的指针本身位于函数的堆栈上,一旦函数返回,就会与函数范围内的所有其他内容一起弹出。

于 2013-02-15T17:50:38.013 回答
1

ainfunc1是按值传递,这意味着它在堆栈上。因此它不会造成任何内存泄漏。func退出时释放。

于 2013-02-15T17:49:20.570 回答
0

当你传递a给你的函数时,它本身的副本a就是被传递的。当函数退出时,该副本a被销毁。指向的内存a根本不会复制到您的代码中。

您的代码泄漏了一个字节的内存1因为您func1在无限循环中调用,所以delete a;永远不会执行。然而,当大多数人谈论/考虑内存泄漏时,他们想到的是“渐进式”泄漏——程序运行时间越长,泄漏的内存越多。


  1. 如果您想获得技术知识,它泄漏的是内存管理器中的一个最小大小的块。这通常会大于 1 个字节,但究竟大多少将取决于实现。
于 2013-02-15T17:55:18.687 回答
0

如图所示,您的代码没有内存泄漏。

于 2013-02-15T17:49:24.920 回答
0

a它确实在堆栈上创建了一个副本。但是,一旦函数返回,该内存就会恢复。

如果您有内存泄漏,这可能是由此处未显示的代码引起的。

于 2013-02-15T17:49:44.543 回答