1

メンバー変数 pointer を作成するとしますpBuffer。このバッファを未知の土地に送り、データで埋めます。ここで、pBuffer に任意の量のデータがあるとします。

Q: 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
}
4

3 に答える 3

1

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);
    }
};
于 2013-02-12T21:16:55.977 に答える
1

realloc()バッファ内のものの量とバッファ内の残りのスペースがわかっている場合は試してください。

于 2013-02-12T21:15:26.317 に答える
0

通常、バッファには最大サイズと現在のサイズが必要です。「リセット」するには、現在のサイズをゼロに設定します。再度使用するときは、バッファーの最大サイズを拡大または縮小する必要がある場合があります。reallocor malloc/ newand (成長時に realloc が内部的に行う) を使用memcpyして、既存のデータを新しいバッファーに移動します。

これらは高価な操作であることに注意してください。バッファーが使用ごとに大きくなることが予想される場合は、毎回最大サイズを 2 倍にすることを検討してください。これにより、割り当てとコピーのコストが効果的に償却されます。

于 2013-02-12T21:18:01.597 に答える