引用计数垃圾回收

时间:2018-11-09 14:01:49

标签: c++ garbage-collection reference-counting

考虑一个简单的类:

class MyInt {
public:
    MyInt();

    MyInt(const char *num);
};

我想将引用计数设计模式集成到该类中,这意味着我需要跟踪指向该类实例的指针数量。我只需要在此类中实现它,或者创建另一个类并继承它即可。

给出以下示例代码,我想清除程序的所有已分配内存:

int main() {
    MyInt*a = new MyInt("10");
    a = new MyInt("20");
    delete a;
    return 0;
}

我的尝试

我尝试将'='的运算符全部装入并添加referenceCount成员:

MyInt &MyInt::operator=(const MyInt* right) {
    MyInt*left = this;
    *this = right;
    left->referenceCount -= 1;
    if (left->referenceCount == 0) {
        delete (left);
    }
    return *this;
}

但这不起作用,因为我们将类的指针分配给另一个指针。

还尝试覆盖new和delete运算符,但似乎无法使其起作用并跟踪实例的指针数量。

似乎我需要实现四件事:复制构造函数,新运算符,删除运算符和=。

我如何有效地跟踪指针并自动清除未指向的内存?

2 个答案:

答案 0 :(得分:2)

std::shared_ptr正是这样做的。来自裁判:

  

管理指针的存储,提供有限的   垃圾收集设施,可能与   其他对象。 [...]一旦所有共享所有权的shared_ptr对象   如果指针已释放此所有权,则托管对象是   删除。

所以我建议您改用它。

答案 1 :(得分:1)

a是一个指针,因此分配给a不会以任何方式涉及MyInt::opterator=。无法通过重载T的运算符来检测何时分配了指向T的指针。为此,您需要设计一个行为类似于指针的class类型。然后,您可以正确跟踪指针何时泄漏对象并正确删除它。对您来说幸运的是,标准库已经提供了此class。是std::shared_ptr。这是修改为使用std::shared_ptr的示例:

#include <memory>

struct InfInt {
    InfInt(const char *) {}
};

int main() 
{
    auto a = std::make_shared<InfInt>("10");
    a = std::make_shared<InfInt>("20"); // the previous `a` is deleted

    // The object pointed to by `a` is automatically deleted when 
    //  the last reference to it goes out of scope
    return 0;   
}