私はメモリバッファを保持する単純な参照カウントクラスを持っています。これは次のようになります。小さなref-countingバッファクラスのメモリ破損
#include <algorithm>
template<typename T>
struct buffer
{
// create a buffer of length n
buffer(unsigned n) : rc(*(new unsigned(1))), data(new T[n]) { }
buffer(const buffer<T> & rhs) : rc(++rhs.rc), data(rhs.data) { }
buffer<T>& operator=(buffer<T> rhs)
{
std::swap(rc, rhs.rc);
std::swap(data, rhs.data);
return *this;
}
~buffer()
{
if (--rc == 0) {
delete [] data;
delete (&rc);
}
}
private:
mutable unsigned & rc;
T * data;
};
int main() {
typedef buffer<int> numbers;
numbers n1(10);
numbers n2(20);
numbers n3(30);
n1 = n2 = n3 = n2;
}
コードに間違いはありません。しかし、Visual Studioとvalgrindはメモリ破損に苦情を言います。
私はこのコードをあまりにも長く見過ごしています。誰もがエラーを見つけることができますか?
'変更可能な符号なし& rc;' ... 'rc(*(新しい署名なし(1)))'なぜこれをやっていますか? –
これは例外セーフではありません。初期化子リスト内の新しい式のいずれかが失敗した場合、クリーンアップする方法はありません。 –
@JamesMcNellis私は別の何かをするように感じました(それはおもちゃのコードです)。例外的な安全性に関してあなたは正しいです。しかし、私はリークは2番目の 'new'が(配列の)失敗した場合にのみ発生し、' rc'変数に割り当てられたメモリだけがリークすると考えています。 (私はここで例外的で安全でないコードを正当化しようとはしていませんが、結局は間違いです。) – StackedCrooked