C++内存管理错误

memory management error in C++

本文关键字:错误 管理 内存 C++      更新时间:2023-10-16

我对以下测试片段有疑问。我使用 Node 指针指向函数 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超出范围时,编译器将为您执行此操作。

test2返回Node对象的引用,该对象被复制(或移动)到n n因为它不是引用。此对象现在驻留在堆栈上,对堆栈上的对象调用 delete 是非法的。

为什么删除失败?

这里

x = &n;
delete x;  //Error

您正在分配局部变量的地址

Node n = test2(m);

不能(也不需要)由delete处理。