考虑一个简单的类:
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运算符,但似乎无法使其起作用并跟踪实例的指针数量。
似乎我需要实现四件事:复制构造函数,新运算符,删除运算符和=。
我如何有效地跟踪指针并自动清除未指向的内存?
答案 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;
}