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

时间:2016-02-08 12:04:55

标签: c++ memory memory-management

我有一个班级:

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++;
    }
}

我知道由于new A()的构造函数中的class B,我遇到了内存泄漏问题。所以我试图在每个while循环之后获得释放内存的帮助,这意味着回收vec_b所占用的所有内存以及向量中B类的所有对象,最重要的是释放由A类对象占用的内存。 非常感谢你!

3 个答案:

答案 0 :(得分:0)

这似乎应该是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>();
}

答案 1 :(得分:0)

在b类的析构函数中写下删除

B::~B
{
delete member_a;
}

答案 2 :(得分:0)

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

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

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

在B类中拥有一个坚实的A实例可以避免内存管理方面的麻烦。