C++内存泄漏

C++ Memory leak

本文关键字:泄漏 内存 C++      更新时间:2023-10-16

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

    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;

是的,它会复制指针a,但不会复制a指向的内存。因此,这里没有内存泄漏,因此没有任何可用空间。

func1中的a是按值传递的,这意味着它在堆栈上。因此,它不会创建任何内存泄漏。func退出时释放。

如果您没有在func1中显式分配任何内存,并且没有调用这样做的函数,那么就没有内存泄漏。复制到函数中的只是一个指针。复制的指针本身在函数的堆栈上,一旦函数返回,它就会与函数范围内的所有其他指针一起弹出。

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

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

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

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

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


  1. 如果你想获得技术,它泄漏的是来自内存管理器的一个最小大小的块。它通常会大于1个字节,但具体大多少取决于实现