如何解决这个对象引用计数器可以用shared_ptr或一些智能指针替换吗? Live code
这是一个模拟“烫手山芋”的示例程序。 Potato
对象被创建并可以通过复制、移动等方式传递,一旦 Potato 最终被销毁而没有传递,它就会退出程序。
Live code
我通过为每个 新 马铃薯提供唯一 ID 并使用单例马铃薯管理器 (PotatoFarm
) 来跟踪引用计数来实现此目的。每次构造或复制 Potato
时,我都会增加引用计数。每次它被销毁时,我都会减少引用计数,一旦它达到零,我就“丢弃”土豆。
class Potato {
public:
using Id = std::size_t;
// new potato,assign new id and increment ref count
Potato() : _id(PotatoFarm::get().nextId()) {
PotatoFarm::get().incRefCt(_id);
}
// copied potato,just increment ref count
Potato(const Potato& p) : _id(p._id) {
PotatoFarm::get().incRefCt(_id);
}
// dtor,decrement and check reference count
~Potato() {
if (PotatoFarm::get().decChkRefCt(_id)) { // returns true when ref ct reaches 0
std::cout << "dropped the hot potato\n";
exit(1);
}
}
// Example of a method that possibly mutates Potato and returns the object back
Potato passthru() {
std::cout << "passing thru\n";
return *this;
}
private:
Id _id;
};
单身经理:
class PotatoFarm {
public:
using Id = std::size_t;
PotatoFarm() : _next(0) {}
// get singleton instance
static PotatoFarm& get() {
static PotatoFarm s_obj;
return s_obj;
}
Id nextId() { return _next++; }
// reference counting of Potatoes by id
std::size_t incRefCt(Id id) { return ++_refCt[id]; }
bool decChkRefCt(Id id) { // return true when 0
if (--_refCt[id] == 0) {
_refCt.erase(id);
return true;
}
return false;
}
private:
Id _next;
std::unordered_map<Id,std::size_t> _refCt;
};
以及传递土豆的代码:
Potato bar() {
std::cout << "in bar\n";
return Potato();
}
Potato foo() {
std::cout << "in foo\n";
Potato hp = bar().passthru();
std::cout << "after bar\n";
return hp;
}
int main(void) {
Potato hp = foo();
std::cout << "after foo\n"; // this should be printed!
// but the return code of the program should be 1
return 0;
}
这会根据需要返回:
in foo
in bar
passing thru
after bar
after foo
dropped the hot potato
与其创建自己的引用计数器,还可以仅通过传递智能指针来简化此操作吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。