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句柄a
unique\u ptr
将为您处理解除分配。实现它意味着编译器定义的复制构造函数、复制赋值运算符、移动构造函数、移动赋值运算符和析构函数将立即正常工作。

以下是RAII/Rule of Zero route
(假设您的编译器支持C++11)

A类{};
B类{
私人:
std::唯一的ptr数据;
公众:
B():数据(新A){
}
};

在这种情况下,RAII句柄a
unique\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) {
    }
};