【问题标题】:member functions to free member variable memory释放成员变量内存的成员函数
【发布时间】:2012-08-22 04:03:50
【问题描述】:

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

但是,我有这样的想法,为每个对象实现一个清除内存的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();
}

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

【问题讨论】:

  • 不会显式调用析构函数来实现这一点吗?
  • @MimiEAM 只要你的析构函数可以安全地重复调用
  • @Dave true,并且只要代码的某些部分在调用析构函数后没有引用对象。

标签: c++ object memory-management


【解决方案1】:

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

【讨论】:

  • STL 容器在非常不同的环境中执行此操作。这并不是真的,因此您可以在它们破坏之前清除它们的内存作为优化。这是 容器 的逻辑特性。就像以某种方式添加到容器是合乎逻辑的一样,能够清除容器也是合乎逻辑的。 OPs 提案与 IMO 无关。
  • 补充一下 Dave 的评论,clear 用于 STL 容器的优点是您可以重用内存,这可能与 OP 的情况不同。
  • 尚不清楚 OP 的意图是什么。但现在谴责这项技术还为时过早。如果没有更多的上下文,该技术既不好也不坏。如果按照问题中的建议使用该技术,我只是提供了我需要改进的地方。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 2020-09-29
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多