0

最近我注意到我的一些对象变得非常大,一段时间后我可能不再需要它们了。我可以等到本地作用域结束时析构函数释放内存或使用代码块使用自定义作用域。

但是,我有这样的想法,为每个对象实现一个void MyObject::clear()清除内存的方法:

class MyObject{
    bool is_cleared;
    // Other stuff

public:
    MyObject();
    ~MyObject();

    void clear();
    // Other stuff
};
MyObject::MyObject()
    : is_cleared(false)
    {
        // construct the class
    }
void MyObject::clear(){
    if (!is_cleared){
        // clear memory
        is_cleared = true;
    }


}

MyObject::~MyObject(){
    this->clear();
}

这样我既可以让析构函数清除内存,也可以自己做。这被认为是好的还是坏的做法?我该如何改进它?

4

3 回答 3

0

这种技术并没有什么特别糟糕的地方(例如,它被 STL 容器使用)。但是您还需要实现一个复制构造函数和一个赋值运算符(或使您的对象不可复制且不可分配)。这是因为你已经实现了一个析构函数,所以你必须遵循三的规则

于 2012-08-22T04:17:31.500 回答
0

这是不好的做法。您应该以这样一种方式设计对象的所有权,即当您“[不再] 不再需要它们”时它们就会被破坏。

这可以像在堆上分配对象并在完成后将其删除一样简单。然后它将清理它分配的任何动态内存。

于 2012-08-22T04:17:39.447 回答
0

我会将此标记为不好的做法。

首先,如果你不需要的东西很大,你应该尽快释放它。如果数据在对象死亡之前不应该存在,则不应使用成员将大数据存储在对象中。这条规则应该很少有例外。如果您的许多对象都需要它,那么您正在设计具有太多职责的对象。

那么,你之前测量过需要清理内存吗?如果不是,这可能是不必要的优化。等到他们超出范围,何必呢?

于 2012-08-22T04:20:57.133 回答