c – 小的ref-counting缓冲类中的内存损坏
发布时间:2020-12-16 10:30:14 所属栏目:百科 来源:网络整理
导读:我有一个简单的引用计数类,它包含一个内存缓冲区.它看起来像这样: #include algorithmtemplatetypename Tstruct buffer{ // create a buffer of length n buffer(unsigned n) : rc(*(new unsigned(1))),data(new T[n]) { } buffer(const bufferT rhs) : rc(
我有一个简单的引用计数类,它包含一个内存缓冲区.它看起来像这样:
#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,rhs.rc);你实际上是在交换重新计算的内容,而不是引用.
想象一下你有这种情况: 当你交换(rc,rhs.rc);时,对引用计数的引用将保持不变,并且计数本身将交换.这是两次掉期后的结果: 缓冲区指针是正确的,但对引用计数的引用仍然引用相同的无符号对象.但是交换了这些对象的值.注意缓冲区B在从其中一个交换对象看时是否具有引用计数2,并且当从底部的对象看到时引用引用1. 您需要使用指针进行引用,并交换指针,而不是内容. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |