C++ C++;将另一个智能指针绑定到get返回的指针时共享的\u ptr引用计数

C++ C++;将另一个智能指针绑定到get返回的指针时共享的\u ptr引用计数,c++,syntax,expression,shared-ptr,declaration,C++,Syntax,Expression,Shared Ptr,Declaration,根据“C++入门”第466页,将另一个智能指针绑定到get()返回的指针是错误的。下面是一些代码和进一步的解释。我无法理解部分解释,其中逐字说明: 在这种情况下,p和q都指向同一个内存。因为它们是独立创建的,所以每个引用计数都为1。当定义q的块结束时,q被销毁。销毁q将释放q指向的内存。这使得p成为一个悬空指针,这意味着当我们试图使用p时会发生什么是未定义的 这个问题与我之前提出的一个问题有关,当时我在玩弄我自己的例子,错误地认为第5行正在创建一个临时的共享\u ptr shared_ptr&l

根据“C++入门”第466页,将另一个智能指针绑定到
get()
返回的指针是错误的。下面是一些代码和进一步的解释。我无法理解部分解释,其中逐字说明:

在这种情况下,p和q都指向同一个内存。因为它们是独立创建的,所以每个引用计数都为1。当定义q的块结束时,q被销毁。销毁q将释放q指向的内存。这使得p成为一个悬空指针,这意味着当我们试图使用p时会发生什么是未定义的

这个问题与我之前提出的一个问题有关,当时我在玩弄我自己的例子,错误地认为第5行正在创建一个临时的
共享\u 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';
}
根据上述解释,
p
q
的参考计数均为1

但在添加print语句以输出引用计数时。我得到
p
的使用计数为1,但是
q
的使用计数为0。
q
的使用计数是否也应该为1?还是我遗漏了什么?我可以理解,如果块后
q
参考计数为0

shared_ptr(q)

这将创建一个名为q的共享_ptr,其等效于

shared_ptr<int> q;
shared_ptr q;
它不指向任何东西,因此它的计数是0

如果您想要第二个指向q的共享\u ptr,您需要这个

 shared_ptr<int> p2(q); 
shared_ptr p2(q);

书中有一个bug-在内部块中,
q
是一个空的
共享\u ptr
,与
p.get()
无关

这似乎还没有进入任何已出版的勘误表

以下内容应打印您期望的内容,并与作者的意图一样未定义:

shared_ptr<int> p(new int(42));
{ 
  shared_ptr<int> q(p.get()); 
  cout << p.use_count() << '\n' << q.use_count() <<'\n';
}
shared_ptr p(新int(42));
{ 
共享的(p.get());

问题在于作用域,在内部作用域中隐藏变量名,以及一个奇怪(但有效)的声明变量的语法。如果它是临时的,您的代码将不会编译,因为
q
将是
int*
@molbdnilo它编译我希望隐藏,即使我不知道这可能发生在不同的types@Narase它之所以编译,是因为没有临时。是相同的代码,但具有实际的临时(“错误:请求'q'中的成员'use_count',这是非类类型'int*'”)抱歉,这并没有回答我的问题,而且它似乎误解了我的问题。这里没有“我想要的”“我的问题是为什么新创建的SyrdJPTR Q引用计数0,当根据C++引物时,它应该有引用计数1。@ SOHOF <代码> SyddY-PTR(q)
shared\u ptr q;
相同,即声明一个
shared\u ptr
不指向任何内容。@Sohof你误解了答案。确实你想要什么,它是指向q的第二个shared\u ptr,你想知道为什么它的计数是0。这是因为你从未链接它们,因为你创建了一个空的shared\u ptr,当然,它有一个建议不是0,因为它不指向anything@Narase那么你的意思是当这本书写下“//未定义的两个独立的共享\u ptr指向同一个内存时”并且进一步把Q销毁成P,成为一个悬空指针,不知何故,它们从来没有链接到开始?还有为什么书说Q应该有一个参考计数为1?(根据我的知识,Lippman的C++底漆应该是一本受人尊敬的书).还是我仍然误解了你的答案?@Sohof你100%确定你书中的那句话是
shared\u ptr(q)
?我怀疑出了什么问题,但不确定这是否是本书中的一个bug。从我链接到的关于这个主题的第一个问题中可以看出,我最初认为正在创建一个临时的,因为语法非常类似。
shared_ptr<int> p(new int(42));
{ 
  shared_ptr<int> q(p.get()); 
  cout << p.use_count() << '\n' << q.use_count() <<'\n';
}