【发布时间】:2017-03-22 16:20:13
【问题描述】:
最近我在工作中对shared_ptr 的引用存有疑问。这是代码。
for (const auto & aRef : aVec) {
THROW_RUNTIME_IFNULLPTR(aRef);
// do sth
}
这是我同事的代码。在我看来,aRef 是一个永远不能为空的引用。虽然有人告诉我(auto &)aRef 仍然是一个指针,所以它可能为空。参考只是为了不增加计数器。我对此很困惑。
不过应该是这样的
for (const auto & aRef : aVec) {
// THROW_RUNTIME_IFNULLPTR(aRef);
if ( aRef ) {
aRef->getX();
}
// do sth
}
我错了吗?我不认为aRef 是一个指针。
【问题讨论】:
-
在提供的示例中,
aVec是什么?什么类型? -
对不起,是shared_ptr的向量
-
我想你可以有一个指向空指针的引用。 (编辑:添加了一个逗号:>)
-
aRef 是一个引用,所以它永远不能为空。它可以是一个确实为空的有效指针的别名......如果这就是你的意思。
-
关于:“参考只是为了不增加计数器。我对此很困惑。”
shared_ptr是一个引用计数指针。每次复制shared_ptr时,引用计数都会增加。每次销毁副本时,计数都会减少。当引用计数为零时,指针为deleteed。通过使用引用,shared_ptr不会被复制,从而节省了复制构造和销毁以及引用计数开销。
标签: c++ reference shared-ptr