C++内存管理错误
memory management error in C++
我对以下测试片段有疑问。我使用 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
处理。
相关文章:
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 试图建立银行管理系统,但有错误
- MPI 应用程序无法连接到 SMPD 管理器 (空):55846 错误 1722
- 加速进程间:管理共享内存错误
- C++ 提升示例:创建和管理线程(编译错误)
- 使用柯南包管理器提升链接错误
- Microsoft访问 ODBC 驱动程序管理器函数序列错误
- 将C#struct传递给C 不受管理的DLL返回错误结果
- 纠正C++学校图书馆管理程序中的两个错误
- 在调试时C++库管理错误
- 数据管理错误C++
- 是否可以在VS中管理所有或大多数C++错误
- 模板中的错误可能是错误的设计资源管理器
- C++ - 避免使用多个 if 语句来管理错误
- 尝试在 C++ 中实现状态管理器时出现链接错误
- C++内存管理错误
- glut32.dll 缺少错误.一种在非管理访问计算机上摆脱它的方法
- Qt创建者会话管理器错误
- 为什么将场景管理器设置为场景节点的父级会在Irrlicht中引发错误
- 删除对象时C++自定义内存管理器错误