2013-02-12 125 views
1

说我创建一个成员变量指针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 
} 
+2

如果它只是一个缓冲区指针,“重新分配所有不必要的记忆”是删除它几乎100%。通常,开发人员不会释放内存,只需回收缓冲区并用新数据覆盖它(请参阅@andre)。 – 2013-02-12 21:17:56

+1

等待,你想释放但不删除它?这完全没有意义! – 2013-02-12 21:18:05

+0

..或换一种说法,请参阅@MooingDuck评论。 – 2013-02-12 21:19:06

回答

1

尝试realloc(),如果你知道的东西在缓存VS在缓冲区中的剩余空间量。

1

只使用一个原始指针,不;但如果保持大小变量,则可以相对容易地重置缓冲区。

然而,这个被标记为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); 
    } 
}; 
+1

第一句话是误导性的,因为它可以很容易地用原始指针来完成。指向数据开始的指针,指向数据结尾的指针以及指向缓冲区结尾的指针。 – 2013-02-12 21:20:12

+0

不够公平,我的意思是使用_single_原始指针。 :) – Chad 2013-02-12 21:20:50

0

缓冲区通常需要最大大小和当前大小。要“重置”,您需要将当前大小设置为零。当您再次使用它时,您可能需要增大或缩小缓冲区的最大大小。使用reallocmalloc/newmemcpy(其realloc的生长时内部确实)到现有的数据移动到新的缓冲器。

注意,这些都是代价高昂的操作。如果您希望缓冲区需要从使用增长到使用,那么您可以考虑每次都将其最大大小加倍。这有效地摊销了分配和复制的成本。