c++ - 我不明白我在引用计数中的内存错误

标签 c++ valgrind reference-counting

我正在实现一个人为的例子来遵循 this tutorial关于引用计数:

struct Bar
{
    Bar () : refs(1) {}
    int x;
    int y;
    int z;

    unsigned refs;
};

class Foo
{
    public:
        Foo () 
        {
            bar = new Bar;
            bar->x = 5;
            bar->y = 10; 
            bar->z = 15;
        }

        Foo (const Foo &other) : bar(other.bar)
        {
            ++bar->refs;
        }

        Foo& operator = (const Foo &other)
        {
            if (&other != this)
            {
                if (--bar->refs < 1)
                    delete bar;
                bar = other.bar;
                // this would fix it: ++bar->refs;
            }

            return *this;
        }

        ~Foo ()
        {
            if (--bar->refs < 1)
                delete bar;
        }

    private:
        Bar *bar;
};

int main(void)
{
    Foo a;
    Foo b = a;
    Foo c;
    c = b;
}

Valgrind 给了我以下错误,尽管没有内存泄漏。谁能帮我解释一下?

==6814== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 2 from 2)
==6814== 
==6814== 1 errors in context 1 of 3:
==6814== Invalid read of size 4
==6814==    at 0x400914: Foo::~Foo() (ref-count.cpp:41)
==6814==    by 0x4007CA: main (ref-count.cpp:54)
==6814==  Address 0x4c2d04c is 12 bytes inside a block of size 16 free'd
==6814==    at 0x4A07991: operator delete(void*) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==6814==    by 0x40092E: Foo::~Foo() (ref-count.cpp:42)
==6814==    by 0x4007BE: main (ref-count.cpp:52)
==6814== 
==6814== 
==6814== 1 errors in context 2 of 3:
==6814== Invalid write of size 4
==6814==    at 0x400911: Foo::~Foo() (ref-count.cpp:41)
==6814==    by 0x4007CA: main (ref-count.cpp:54)
==6814==  Address 0x4c2d04c is 12 bytes inside a block of size 16 free'd
==6814==    at 0x4A07991: operator delete(void*) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==6814==    by 0x40092E: Foo::~Foo() (ref-count.cpp:42)
==6814==    by 0x4007BE: main (ref-count.cpp:52)
==6814== 
==6814== 
==6814== 1 errors in context 3 of 3:
==6814== Invalid read of size 4
==6814==    at 0x40090B: Foo::~Foo() (ref-count.cpp:41)
==6814==    by 0x4007CA: main (ref-count.cpp:54)
==6814==  Address 0x4c2d04c is 12 bytes inside a block of size 16 free'd
==6814==    at 0x4A07991: operator delete(void*) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==6814==    by 0x40092E: Foo::~Foo() (ref-count.cpp:42)
==6814==    by 0x4007BE: main (ref-count.cpp:52)

编辑:请参阅 operator = 中的注释行以进行修复。

最佳答案

复制赋值运算符需要增加引用计数。

关于c++ - 我不明白我在引用计数中的内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23159079/

相关文章:

objective-c - 抑制来自 iOS SDK 的 Valgrind 警告

c++ - 共享指针不增加 use_count

c++ - 引用计数指针的 STL 类?

binary-tree - 处理 AVL 树中的重复键

c - Realloc 内部函数

c++ - 错误 MSB6006 : "cmd.exe" exited with code 3

c++ - 我如何使用(char)来获取句子并输出它们(c++)?

C++ 路径查找中的指针所有权

c - Valgrind 发现内存泄漏,但我无法理解

c++ - 使用 C++ 运行一个进程,过滤输出并获取结果代码并获取系统错误,全部一起