Ich habe eine einfache referenzzählende Klasse, die einen Speicherbuffer enthält. Es sieht so aus:
#include
template
struct buffer
{
// Erstellt einen Puffer der Länge n
buffer(unsigned n) : rc(*(new unsigned(1))), data(new T[n]) { }
buffer(const buffer & rhs) : rc(++rhs.rc), data(rhs.data) { }
buffer& operator=(buffer 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 numbers;
numbers n1(10);
numbers n2(20);
numbers n3(30);
n1 = n2 = n3 = n2;
}
Ich sehe keinen Fehler im Code. Allerdings beschweren sich Visual Studio und valgrind über Speicherkorruption.
Ich habe diesen Code jetzt viel zu lange angestarrt. Kann jemand den Fehler erkennen?