【发布时间】:2019-06-19 07:51:58
【问题描述】:
根据“C++ Primer”第466页,将另一个智能指针绑定到get()返回的指针是错误的。接下来是一些代码和进一步的解释。我无法理解部分解释,逐字说明:
在这种情况下,p 和 q 都指向同一个内存。因为它们是相互独立创建的,所以每个引用计数为 1。当定义 q 的块结束时,q 被销毁。销毁 q 会释放 q 指向的内存。这使得 p 成为一个悬空指针,这意味着当我们尝试使用 p 时发生的事情是未定义的。
这个问题与我之前提出的问题Understanding C++ std::shared_ptr when used with temporary objects 相关,当时我正在玩弄自己的示例,并错误地认为在第 5 行创建了一个临时的shared_ptr。
shared_ptr<int> p(new int(42));
int *q = p.get();
{ // new block
// undefined: two independent shared_ptrs point to same memory
shared_ptr<int>(q);
cout << p.use_count() << '\n' << q.use_count() <<'\n';
}
Output: 1 0
根据上面的解释,p 和 q 的引用计数都是 1。
但是当添加一个打印语句来输出引用计数时。我知道p 的使用次数为 1,但 q 的使用次数为 0。q 的使用次数不应该为 1 吗?还是我错过了什么?如果 q 引用计数在块后为 0,我会理解。
【问题讨论】:
-
问题在于作用域、内部作用域中的变量名隐藏以及声明变量的奇怪(但有效)语法。
-
如果它是临时的,您的代码将无法编译,因为
q将是int*。 -
@molbdnilo 它编译了godbolt.org/z/fPwchN 我预计会出现阴影,即使我不知道这可能会发生在不同的类型上
-
@Narase 它编译是因为没有临时的。 Here 是相同的代码,但有一个实际的临时代码。 ("error: request for member 'use_count' in 'q', which is non-class type 'int*'")
标签: c++ syntax expression shared-ptr declaration