类在另一个类内部的内存释放

Memory deallocation of class inside of another class

本文关键字:内存 释放 内部 另一个      更新时间:2023-10-16

我正在努力理解如果一个类创建了另一个类,如何返回内存。

我有

 Clas A;

然后是另一个为A类分配内存的类:

class B{
    private:
        A* data;
    public:
        // Allocating new memory
        B (){
                  A* data =  new A();
        //giving memory back
        ~B(){
                   delete data; };
};

当我在主函数中执行代码时,它就会崩溃。我做错了什么?我在这里有点迷路了。谢谢

去掉构造函数中多余的A*。这样做的目的是创建一个与类成员同名的新的局部变量。所以真正的B::data从来没有得到任何分配,当你试图删除它时,事情就会爆炸。雪上加霜的是,您分配给本地datanew A()将被泄露(好吧,如果程序没有崩溃,它被泄露(。

class B{
    private:
        A* data;
    public:
        // Allocating new memory
        B (){
           data =  new A();
        }
        //giving memory back
        ~B(){
           delete data;
        }
};

这解决了眼前的问题,但正如juancopanza在评论中指出的那样,如果你试图复制这个对象,你仍然会遇到问题。

这是RAII/Rule of Zero路由(假设您的编译器支持C++11(

class A {};
class B {
private:
    std::unique_ptr<A> data;
public:
    B() : data(new A) {
    }
};

在这种情况下,RAII句柄unique_ptr将为您处理解除分配。实现它意味着编译器定义的复制构造函数、复制赋值运算符、移动构造函数、移动赋值运算符和析构函数都可以正常工作。