加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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.

您需要使用指针进行引用,并交换指针,而不是内容.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读