在foo1
您按值传递参数(即共享指针)时。因此,复制构造函数 ofstd::shared_ptr<X>
将被调用(即,当在}
of调用本地副本的析构函数时,引用计数器将增加然后减少foo1
)。
在您通过引用foo2
传递参数(即共享指针) 。const
因此,您传递了const
原始对象的限定别名(即,不会增加 ref 计数器)。
您还可以在以下示例中看到这一点:
struct X {};
void foo1(std::shared_ptr<X> x) {
std::cout << "count in foo1(): " << x.use_count() << std::endl;
}
void foo2(const std::shared_ptr<X>& x) {
std::cout << "count in foo2(): " << x.use_count() << std::endl;
}
int main() {
std::shared_ptr<X> x(new X);
std::cout << "count in main(): " << x.use_count() << std::endl;
foo1(x);
foo2(x);
}
输出:
count in main(): 1
count in foo1(): 2
count in foo2(): 1
如您所见foo1
,不同的 shared_ptr 实例的数量为 2。这是在 中shared_ptr
定义的原始main
和在 中的副本foo1
。而在foo2
ref 计数器中仍然为 1。
因此,你的推理是正确的。