c ++析构函数 - 何时使用它们以及要删除的内容

时间:2012-05-11 14:19:49

标签: c++ class destructor

我在当前项目上遇到了困难。在以前的版本中,我使用了std :: vectors,一切都很好,没有内存泄漏,没有错误,就好了。

然后我切换到使用一些指针,因为它更优雅,我的性能有所改善。

所以我有像

这样的课程
class A
{
    private:
        std::string str;
    public:
        A() {str = "";}
};

class B
{
    private:
        std::string str;
        A* a;
    public:
        B() {str = ""; a = NULL; }
};

class C
{
    private:
        std::vector<B*> bs;
    public:
        C() { bs = std::vector<B*>(); }

};

我知道每次使用new时,我都必须事后delete。所以我为class Bclass C创建了析构函数。

这就是我认为应该是这样的:

B::~B()
{
    if ( this->a != NULL )
        delete this->a;
}

C::~C()
{
    while ( (this->bs).size() > 0 )
    {
        if ( (this->bs).back() != NULL )
            delete (this->bs).back();
        (this->bs).pop_back();
    }
    (this->bs).clear(); // not necessary since bs has size 0?
}

但有了这个,我收到了各种错误,例如valgrind中的“4号读取无效”。

我对析构函数应该是什么样的看法好吗? 我的代码还有什么问题? 将私有std::string成员更改为std::string - 指针是否合适? 在析构函数中执行str = "";是必要的还是好的?

旁注:请理解我已经对“正确的析构函数”和类似的关键字进行了大量搜索,但它没有帮助。如果你认为这个问题经常被问到:我没有,因为我没有得到它。

1 个答案:

答案 0 :(得分:1)

Rob说,你的析构函数可以简化为:

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

C::~C()
{
    for (size_t i = 0; i < bs.size(); ++i)
        delete bs[i];
}