C++ 类在另一个类中的内存释放
我试图理解如果一个类创建了另一个类,如何返回内存 我有C++ 类在另一个类中的内存释放,c++,pointers,memory,reference,allocation,C++,Pointers,Memory,Reference,Allocation,我试图理解如果一个类创建了另一个类,如何返回内存 我有 Clas A; 然后是另一个为类A分配内存的类: class B{ private: A* data; public: // Allocating new memory B (){ A* data = new A(); //giving memory back ~B(){
Clas A;
然后是另一个为类A分配内存的类:
class B{
private:
A* data;
public:
// Allocating new memory
B (){
A* data = new A();
//giving memory back
~B(){
delete data; };
};
当我在main函数中执行代码时,它就崩溃了。我做错了什么?我在这里有点迷路了。
谢谢。去掉构造函数中多余的
A*
。这样做的目的是创建一个与类成员同名的新局部变量。因此,真正的B::data
永远不会得到分配给它的任何内容,当你试图删除它时,事情就会爆炸。雪上加霜的是,您分配给本地数据的新A()
将被泄漏(如果程序没有崩溃,它将被泄漏)
这解决了眼前的问题,但正如juanchopanza在评论中指出的那样,如果您尝试复制此对象,仍然会遇到问题。清除构造函数中的冗余A*
。这样做的目的是创建一个与类成员同名的新局部变量。因此,真正的B::data
永远不会得到分配给它的任何内容,当你试图删除它时,事情就会爆炸。雪上加霜的是,您分配给本地数据的新A()
将被泄漏(如果程序没有崩溃,它将被泄漏)
这解决了眼前的问题,但正如juanchopanza在评论中指出的那样,如果您尝试复制此对象,仍然会遇到问题。以下是RAII/零路由规则(假设您的编译器支持C++11)
A类{};
B类{
私人:
std::唯一的ptr数据;
公众:
B():数据(新A){
}
};
在这种情况下,RAII句柄aunique\u ptr
将为您处理解除分配。实现它意味着编译器定义的复制构造函数、复制赋值运算符、移动构造函数、移动赋值运算符和析构函数将立即正常工作。以下是RAII/Rule of Zero route(假设您的编译器支持C++11)
A类{};
B类{
私人:
std::唯一的ptr数据;
公众:
B():数据(新A){
}
};
在这种情况下,RAII句柄aunique\u ptr
将为您处理解除分配。实现它意味着编译器定义的复制构造函数、复制赋值运算符、移动构造函数、移动赋值运算符和析构函数将立即正常工作。此外,使用智能指针,而不是手动实现new和delete。RAII模式为你省去了很多痛苦。这门课仍然没有结束。如果您复制或分配一个B
。一个合法点,您会遇到麻烦。我试图解决眼前显而易见的问题,但这一问题肯定会导致更多的麻烦。哦……就这么简单。我想我的思维已经陷入了困境。非常感谢,伙计们。很高兴这有帮助。另外,请确保隐藏copy constructor&assingment操作符,或者如果尚未提供有效的实现(我假设您发布的代码并不代表整个类)。此外,请使用智能指针,而不是手动实现new和delete。RAII模式为你省去了很多痛苦。这门课仍然没有结束。如果您复制或分配一个B
。一个合法点,您会遇到麻烦。我试图解决眼前显而易见的问题,但这一问题肯定会导致更多的麻烦。哦……就这么简单。我想我的思维已经陷入了困境。非常感谢,伙计们。很高兴这有帮助。另外,请确保隐藏copy constructor&assingment操作符,或者提供工作实现(如果您还没有提供的话)(我假设您发布的代码并不代表整个类)。可能重复的Er,oops,top-answer表明这不仅仅是关于三个>的规则。可能重复的Er,oops,上面的答案表明,这不仅仅是关于三个规则>。
class B{
private:
A* data;
public:
// Allocating new memory
B (){
data = new A();
}
//giving memory back
~B(){
delete data;
}
};
class A {};
class B {
private:
std::unique_ptr<A> data;
public:
B() : data(new A) {
}
};