【发布时间】:2013-02-12 21:12:48
【问题描述】:
假设我创建了一个成员变量指针pBuffer。我将此缓冲区发送到某个未知的土地以填充数据。现在说 pBuffer 中有任意数量的数据。
问:有没有办法在不完全删除它的情况下重置 pBuffer,同时释放它占用的所有不必要的内存?
例子:
class Blah
{
public:
unsigned char* pBuffer;
Blah(){pBuffer = NULL;}
~Blah(){}
FillBuffer()
{
//fill the buffer with data, doesn't matter how
}
ResetBuffer()
{
//????? reset the buffer without deleting it, still deallocate memory ?????
}
};
int main()
{
Blah b;
b.FillBuffer();
b.ResetBuffer();
b.FillBuffer(); //if pBuffer were deleted, this wouldn't work
}
【问题讨论】:
-
如果它只是一个缓冲区指针,“释放所有不必要的内存”大约是删除它的 100%。通常,开发人员不会释放内存,只是回收缓冲区并用新数据覆盖它,(参见@andre)。
-
等等,你想释放而不是删除它?这完全没有意义!
-
..或者,换句话说,请参阅@MooingDuck 评论。
-
好吧,因为我不知道缓冲区会放入多少数据,所以第一次可以占用1,000,000字节,第二次只能占用1个字节。我想以某种方式释放 1,000,000 个字节并“从头开始”,这样如果我只需要 1 个字节,我就不会第二次分配所有 100 万个字节。
-
不值得。使用大小合理的缓冲区池,并在运行期间放弃 new、delete、realloc 等任何操作。如果您的服务器(或其他)经常需要处理具有广泛变化的有效负载的不同协议,请使用每个缓冲区大小不同的缓冲区 poo 数组(128、1K、4K、16K 等)。始终以 128 开头。如果“whatever”返回 128 字节,则使用下一个大小,如果缓冲区返回未填充,则使用下一个大小,(或再次以 128 开头)。
标签: c++ pointers memory buffer