是否有一种方法来判断是否分配了内存缓冲区并且必须删除
Is there a way to tell if a memory buffer was allocated and must be deleted?
我想出了一个聪明(或愚蠢)的设计模式。在我们的一个用例中,可能有需要创建一个大的内存缓冲区,该缓冲区将在类实例的生命周期中反复使用。在我们不需要内存缓冲区的情况下,我希望避免创建它。所以我想到了下面这个:
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_;
}
}
相关文章:
- 是否可以从 OpenGL 缓冲区获取原始大小的像素?
- 是否可以在 OpenGL 中的同一调用中呈现两个具有不同索引起点的不同缓冲区?
- 是否可以将 std::basic_ifstream 和 std::basic_ofstream 与自定义缓冲区一起使用?
- 是否可以在C++中拼接缓冲区,零拷贝?
- std::vector::assign/std::vector::operator=(const&) 是否保证在"this"中重用缓冲区?
- 输出操纵器 std::ends 是否向输出缓冲区添加空字符?
- 是否可以等待来自暂存缓冲区的传输完成而不调用 vkQueueWaitIdle
- Qt是否能够支持小缓冲区低延迟视频应用(例如实时流)
- C 文本写入随机数据.是否有缓冲区溢出
- 在C 中,是否有可能在不兼容类型的std ::向量对象之间传输不同类型的缓冲区
- 我是否需要删除传递给谷歌协议缓冲区(protobuf)的对象
- 是否可以在同一设备缓冲区上一个接一个地调用 OpenCL 内核?
- 当构建器被销毁时,缓冲区是否有效
- 使用大长度缓冲区初始化字符串流是否会使内存使用量加倍
- 如何检查输入缓冲区是否为空
- 如何检查 cin 缓冲区是否包含相同的值 0.5 秒 (C++)
- 将新放置到缓冲区后,缓冲区和实例是否具有相同的 void* 地址?
- 是否存在以相反顺序填充缓冲区的MEMSET函数
- 是否可以在键盘输入缓冲区中向前看并在MFC/Win32中检测条形码条目
- 换行符是否也会刷新缓冲区?