如何“重置”缓冲区?
说我创建一个成员变量指针pBuffer
。我将这个缓冲区发送到一些未知的地方,以填充数据。现在说pBuffer中有任意数量的数据。如何“重置”缓冲区?
问:有没有办法来重置p缓冲器而没有完全将其删除,同时还重新分配它占领的所有不必要的内存?
例子:
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
}
尝试realloc()
,如果你知道的东西在缓存VS在缓冲区中的剩余空间量。
只使用一个原始指针,不;但如果保持大小变量,则可以相对容易地重置缓冲区。
然而,这个被标记为C++
,我想从这样提醒你,反而提出了一个替代方案。这符合您的要求,允许分配内存,然后稍后为缓冲区“重置”,而不释放内存。作为一个附带的好处,使用std::vector
意味着你不必担心内存在后续调用泄漏到FillBuffer()
,特别是当现有的缓冲区太小,将需要重新分配。
#include <vector>
class Blah
{
public:
std::vector<unsigned char> pBuffer;
Blah(){}
~Blah(){}
FillBuffer()
{
//fill the buffer with data, doesn't matter how
}
ResetBuffer()
{
pBuffer.clear();
// if you _really_ want the memory "pointed to" to be freed to the heap
// use the std::vector<> swap idiom:
// std::vector<unsigned char> empty_vec;
// pBuffer.swap(empty_vec);
}
};
第一句话是误导性的,因为它可以很容易地用原始指针来完成。指向数据开始的指针,指向数据结尾的指针以及指向缓冲区结尾的指针。 – 2013-02-12 21:20:12
不够公平,我的意思是使用_single_原始指针。 :) – Chad 2013-02-12 21:20:50
缓冲区通常需要最大大小和当前大小。要“重置”,您需要将当前大小设置为零。当您再次使用它时,您可能需要增大或缩小缓冲区的最大大小。使用realloc
或malloc
/new
和memcpy
(其realloc的生长时内部确实)到现有的数据移动到新的缓冲器。
注意,这些都是代价高昂的操作。如果您希望缓冲区需要从使用增长到使用,那么您可以考虑每次都将其最大大小加倍。这有效地摊销了分配和复制的成本。
如果它只是一个缓冲区指针,“重新分配所有不必要的记忆”是删除它几乎100%。通常,开发人员不会释放内存,只需回收缓冲区并用新数据覆盖它(请参阅@andre)。 – 2013-02-12 21:17:56
等待,你想释放但不删除它?这完全没有意义! – 2013-02-12 21:18:05
..或换一种说法,请参阅@MooingDuck评论。 – 2013-02-12 21:19:06