C ++ Primer 5 Edition:计数参考和基础指针

Ita*_*iwa 4 c++ shared-ptr c++11

在C ++入门5版中。std::shared_ptr据说第十二章:

p = q;
Run Code Online (Sandbox Code Playgroud)

p并且qshared_ptr可以互相转换的保持指针。如果's'的计数变为0,则减少p's的引用计数并增加q's的计数,删除p's现有的内存p

所以我尝试了这个:

std::shared_ptr<int> sp1 = std::make_shared<int>(10);
decltype(sp1) sp2 = nullptr;

std::cout << sp1.use_count() << std::endl;
std::cout << sp2.use_count() << std::endl;

sp2 = sp1;

std::cout << sp1.use_count() << std::endl;
std::cout << sp2.use_count() << std::endl;
Run Code Online (Sandbox Code Playgroud)

输出:

sp1.use_count(): 1
sp2.use_count(): 0
sp1.use_count(): 2
sp2.use_count(): 2
Run Code Online (Sandbox Code Playgroud)
  • 为什么sp1sp2具有相同use_count?上面说过,赋值递减p的参考计数和增量q的计数?

  • 此外,我不知道这种情况下可能是潜在的三分球sp1sp2比是相同的类型转换为彼此其他:

    std::shared_ptr<int> spi = std::make_shared<int>(0);
    std::shared_ptr<short> sps = spi; // error
    
    Run Code Online (Sandbox Code Playgroud)

我认为short可以转换为,int但为什么不起作用?众所周知,它类似于容器:容器类型(类型名称和元素类型)必须相同。然后,我在书中没有明白这一点:“ pqshared_ptr保持可相互转换的指针。”

Lig*_*ica 5

为什么sp1和sp2具有相同的use_count?

您有两个共享的指针sp1sp2指向同一资源。

因此,两个共享指针均指示资源的“使用计数”为2。


上面说过,赋值递减p的参考计数并递增q的计数?

如果p最初指向其他东西,它会做。现在,您将少一个指向该其他资源的共享指针。


我认为[ int]可以转换为[ short],但为什么不起作用?

是的,int可以将转换为short。也就是说,您可以采用int并创建一个short具有相同值的新值(如果它在类型范围内)。

但是a short不是int,因此,如果有int,则不能使用a short*指向它。

这与共享指针无关。试一试:

int x = 0;
short* y = &x;
Run Code Online (Sandbox Code Playgroud)

并且您会看到您无法拥有它,也没有任何意义。


我可能知道它类似于容器:容器类型(类型名称和元素类型)必须相同

不,与它无关。


我在书中没有明白这一点:“ p和q是shared_ptrs,它们持有可以相互转换的指针。”

有些指针可转换的,例如Derived*to Base*

他的意思是,“在此示例中,假设pq均为shared_ptrs,或者是完全相同的类型,或者至少是可转换类型的,所以=合法”。