私が書いた古い循環バッファクラスをより堅牢にするために作り直しています。タイプ T のヒープにバッファーを割り当てています (そのため、クラスはテンプレート化されています)。ただし、動的に割り当てられたスペースへのポインターである T で可能なリソースの解放に問題があります。
これは、デフォルト値パラメーターを持つ ctor です。
template <typename T, unsigned int SIZE>
CircularBuffer(const T default_val) {
_buffer = new T[SIZE];
// assign each block default value, etc
}
// dtor
~CircularBuffer()
{
delete [] _buffer;
}
ただし、たとえば誰かがこれを行うことにしたとします。
CircularBuffer<int*, 4> cb(new int); // buffer of 4, holding int*, with default value of new int
// later ~CircularBuffer call is made
// user allocated memory is not freed
このメモリを解放する (またはユーザーに解放させる) にはどうすればよいでしょうか? ユーザーの観点から手動で試しました:
delete cb.at(0); // .at returns T& (so it would effectively return the pointer)
// above is access violation
デストラクタでこれを行う方法を見つけようとしましたが、コンパイラはテンプレート T がポインタではないと (たとえそうであったとしても) 考えているため、delete _buffer[i] を行うことができませんでした。
この状況を安全に処理できますか、または責任が私のものではないようにユーザーができることはありますか (クラスはこれを内部的に割り当てていないため、ユーザーはそうです)。
Edit* * * T* をテンプレート パラメーターとして渡すときに new を使用した割り当てでは、期待されるバッファー サイズが返されないことに気付きました。
// call default ctor
CircularBuffer<double*, 2> cb(); // _buffer = new T[SIZE];
// sizeof(_buffer) == 4;
// sizeof(double*) == 4;
// sizeof(double*[2]) == 8; // _buffer should be this size, as it holds 2 4byte pointers, what happened?
これについて新しい質問を作成するか、元の質問をここに残すかはわかりませんが、これは以前に取得していたアクセス違反を説明していると思います (上記のインスタンスの _buffer[1] を逆参照しようとした後)。残念ながら私は何が原因なのかわからない。