gpt4 book ai didi

c++ - 小型引用计数缓冲区类中的内存损坏

转载 作者:太空狗 更新时间:2023-10-29 19:44:29 25 4
gpt4 key购买 nike

我有一个简单的引用计数类,它包含一个内存缓冲区。它看起来像这样:

#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 提示内存损坏。

我已经盯着这段代码看了太久了。谁能发现错误?

最佳答案

一个问题是,当您swap(rc, rhs.rc);时,您实际上是在交换重新计数的内容,而不是引用。

假设您遇到这种情况:

Before

当您swap(rc, rhs.rc); 时,对引用计数的引用将保持不变,并且计数本身将交换。这是两次交换后得到的:

After

缓冲区指针是正确的,但对引用计数的引用仍然指向相同的unsigned 对象。但是这些对象的值被交换了。请注意,当从交换对象之一看时,缓冲区 B 的引用计数是 2,而从底部的对象看时,引用计数是 1。

您需要为引用计数使用指针,并交换指针,而不是内容。

关于c++ - 小型引用计数缓冲区类中的内存损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7828960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com