释放 C++ 中指针成员的动态内存

release dynamic memory for pointer member in c++

本文关键字:动态 内存 成员 指针 C++ 释放      更新时间:2023-10-16

我有一个类:

class A {
    A();
    ////////something about the class A
};

然后我还有另一堂课:

class B {
public:
    B();
    A* member_a;
};
B::B()
{
    this->member_a = new A();
}

我想做的是这样的:

main()
{
    vector<B> vec_b;
    int num=1;
    while(some_condition)
    {
        for (int i=0; i<num; i++)
        {
            vec_b.pushback(B());
        }
        ////////do something about vec_b;
        num++;
    }
}

我知道由于class B构造函数中的new A(),我正面临内存泄漏问题。所以我试图在每次while循环后获得帮助来释放内存,这意味着回收vec_b已经占用的所有内存和向量中 B 类的所有对象,最重要的是释放 A 类对象占用的内存。谢谢!

这似乎是B的析构函数的工作

B::~B()
{
    delete member_a;
}

如果您可以访问 C++11 或更高版本,我宁愿std::unique_ptr这样您就可以免费获得此分配

class B {
public:
    B();
    std::unique_ptr<A> member_a;
};
B::B()
{
    member_a = std::make_unique<A>();
}

类 b 的析构函数中写入删除

B::~B
{
delete member_a;
}

从您在示例中使用类 A 实例的方式来看,在我看来,您实际上根本不需要指向 A 的指针。

  • 如果(且仅当)您打算创建类 A 的子类,则应为成员使用 std::unique_ptr 而不是原始指针。
  • 如果您不打算对类 A 进行子类化,那么最好的选择就是简单地在类 B 中创建 A 的实体实例。

喜欢这个:

class B {
public:
    B();
    A member_a;
};

在 B 类中拥有一个可靠的 A 实例可以避免很多内存管理麻烦。