是否有一种方法来判断是否分配了内存缓冲区并且必须删除

Is there a way to tell if a memory buffer was allocated and must be deleted?

本文关键字:是否 缓冲区 内存 删除 分配 判断 方法 一种      更新时间:2023-10-16

我想出了一个聪明(或愚蠢)的设计模式。在我们的一个用例中,可能有需要创建一个大的内存缓冲区,该缓冲区将在类实例的生命周期中反复使用。在我们不需要内存缓冲区的情况下,我希望避免创建它。所以我想到了下面这个:

class Class {
  public:
    void func()
    {
      if (A) {
        // do something
      } else if (B) {
        // need data buffer, which we will recycle
        static float * data = new float[1000000];
        // do something with the data
      } else {
        ...
      }
    }
  ~Class() {
    // to delete[] or not to delete[] that is the question
  }
}
在析构函数中是否有方法释放这个缓冲区?我可以用delete[],但问题是:我们怎么知道我们是否必须删除缓冲区?换句话说,是否有一种聪明的方法可以知道if (B)是否被执行?当然,我可以用旗帜来做这件事,但我不确定是否有更好的方法。堆上静态内存缓冲区的概念可能被初始化,也可能不被初始化,这让我有点困惑。

可以允许类中存在data,但默认为NULL。当您将它设置为delete []时,如果它没有被分配,它将是nop

如果使用c++ 11,请使用nullptr而不是NULL,因为它更安全(因为nullptr不转换为整型,而NULL通常定义为0)

或者,将data创建为vector<float> data而不是float*,您不需要在析构函数中做任何事情。你不会浪费任何内存如果你从不向向量中添加任何东西。(感谢Manu343726和Malloc)

拥抱std::vector

#include <iostream>
#include <vector>
class Class {
public:
  void func(bool test)
  {
    if (test) {
      data_.resize(1000000);
    }
  }
  ~Class() {
    std::cout << "Destroying data of size: " << data_.size() << std::endl;
  }
private:
  std::vector<float> data_;
};
int main() {
  Class A;
  Class B;
  A.func(true);
  B.func(false);
}
这个打印

:

Destroying data of size: 0
Destroying data of size: 1000000

现场演示

您也可以将所有这些逻辑推迟到vector。当类被析构时,vector析构函数将处理所有情况。一般来说,矢量是缓冲的一种可接受的解决方案。

class Class {
  public:
    void func()
    {
      if (A) {
        // do something
      } else if (B) {
        // need data buffer, which we will recycle
        MyVector.resize(1000000,0.0);
        // do something with the data
      } else {
        ...
      }
    }
   private: 
      vector<float> MyVecto_;
  }
}