gpt4 book ai didi

c++ - 使用 std::unique_ptr 的递归函数内存泄漏

转载 作者:行者123 更新时间:2023-11-30 01:51:05 26 4
gpt4 key购买 nike

我之前没有使用过 std::unique_ptr,所以这是我第一次尝试在递归调用中使用它,如下所示:

#define CRTDBG_MAP_ALLOC

#include <stdlib.h>
#include <crtdbg.h>
#include <memory>

struct S {
S(int X = 0, int Y = 0):x(X), y(Y) {}
int x;
int y;
std::unique_ptr<S> p;
};

void Bar(int i, std::unique_ptr<S> &sp)
{
i--;

sp->p = std::unique_ptr<S>(new S(i, 0));

if (i > 0)
Bar(i, sp->p);
}

int main()
{
std::unique_ptr<S> b (new S());
Bar(5, b);

// Detects memory leaks
_CrtDumpMemoryLeaks();
}

在程序结束时。我发现在 Windows 8 x64 上运行的 Visual C++ 2012 x86 中,根据 _CrtDumpMemoryLeaks();,我分配的任何内存都没有被释放。

最佳答案

一切都将在适当范围的末尾被正确销毁,但您正在检查内存泄漏之前 b 的析构函数被调用:

struct S {
S(int X = 0, int Y = 0) :x(X), y(Y) { std::cout << "built x=" << x << std::endl; }
~S() { std::cout << "destroyed x=" << x << std::endl; }
int x;
int y;
std::unique_ptr<S> p;
};

void Bar(int i, std::unique_ptr<S> &sp)
{
i--;

sp->p = std::unique_ptr<S>(new S(i, 0));

if (i > 0)
Bar(i, sp->p);
}

int main()
{
std::unique_ptr<S> b(new S());
Bar(5, b);

_CrtDumpMemoryLeaks(); // b hasn't been destroyed yet!
}

输出:

built x=0
built x=4
built x=3
built x=2
built x=1
built x=0
["your code is leaking" dump]
destroyed x=0
destroyed x=4
destroyed x=3
destroyed x=2
destroyed x=1
destroyed x=0

关于c++ - 使用 std::unique_ptr 的递归函数内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26571941/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com