gpt4 book ai didi

c++ - C++内存管理错误

转载 作者:行者123 更新时间:2023-11-30 01:45:18 28 4
gpt4 key购买 nike

我对以下测试片段有疑问。我使用一个节点指针指向函数 test2 返回的节点实例。为什么删除失败?

如有任何意见,我们将不胜感激。谢谢!

struct Node
{
int a;
};
Node& test2(Node &n)
{
Node *p = new Node;
p->a = n.a + 5;
return *p;
}
Node* test3(Node &n)
{
Node *p = new Node;
p->a = n.a + 5;
return p;
}
int main()
{
Node m;
m.a = 12;
Node n = test2(m);
Node *x = test3(n);
cout << m.a << ";" << n.a << ";" << x->a << endl;
delete x; //OK
x = &n;
delete x; //Error
return 0;
}

最佳答案

当你写作时

    Node n = test2(m);

n 不是对 test2 创建的 Node 的引用。这是它的拷贝test2 创建的 Node 被泄露。你需要:

    Node& n = test2(m);

顺便说一句:我假设这是一个理解引用和指针的练习。对于一个真正的程序,你总是想写:

std::unique_ptr<Node> test4(const Node& n)
{
std::unique_ptr<Node> result{new Node};
result->a = n.a + 5;
return result;
}

甚至更好:

std::unique_ptr<Node> test4(const Node& n)
{
auto result = std::make_unique<Node>();
result->a = n.a + 5;
return result;
}

使用这两种解决方案中的任何一种,您都无需费心删除分配的 Node - 当您的调用代码中的 unique_ptr 超出范围时,编译器会为您执行此操作。

关于c++ - C++内存管理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34831596/

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