我有一个简单的引用计数类,它包含一个内存缓冲区.它看起来像这样:
#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;
}
Run Code Online (Sandbox Code Playgroud)
我没有看到代码有任何问题.但Visual Studio和valgrind抱怨内存损坏.
我现在盯着这段代码已经太久了.谁能发现错误?
R. *_*des 13
一个问题是,当您swap(rc, rhs.rc);实际交换重新计算的内容时,而不是引用.
想象一下你有这种情况:

当你swap(rc, rhs.rc);,对引用计数的引用将保持不变,并且计数本身将交换.这是两次掉期后的结果:

缓冲区指针是正确的,但对引用计数的引用仍然引用相同的unsigned对象.但是交换了这些对象的值.注意缓冲区B在从其中一个交换对象看时是否具有引用计数2,并且当从底部的对象看到时引用引用1.
您需要使用指针进行引用,并交换指针,而不是内容.
| 归档时间: |
|
| 查看次数: |
194 次 |
| 最近记录: |