C++ primer 5 版:计数引用和底层指针

C++ primer 5 edition: count reference and underlying pointers

C++ primer 5 版。第12章std::shared_ptr据说:

p = q;

"pqshared_ptr 的保存指针,可以相互转换。减少 p 的引用计数并增加 q 的计数,如果 p 的计数变为 0,则删除 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;

输出:

sp1.use_count(): 1
sp2.use_count(): 0
sp1.use_count(): 2
sp2.use_count(): 2

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

Why sp1 and sp2 has the same use_count?

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

所以,两个共享指针都表明资源的"use count"是2。


it is said above that that assignment decrements p's reference count and increments q's count??

如果 p 最初指向其他东西,它就可以了。您现在少了一个指向其他资源的共享指针。


I think [int] can be converted to [short] but why it doesn't work?

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

但是 short 不是 int,所以如果你有一个 int,你不能使用 short* 来指向它。

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

int x = 0;
short* y = &x;

你会发现你不能拥有它,也没有意义。


As I may know it is similar to container: The containers types (type name and element type) must be the same

不,与此没有太大关系。


I don't understand that point here in the book: "p and q are shared_ptrs holding pointers that can be converted to one another."

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

他的意思是,"in this example, assume that p and q are both shared_ptrs, either of the exact same type, or at least of convertible type, so that the = is legal".

Why sp1 and sp2 has the same use_count()? And it is said above that that assignment decrements p's reference count and increments q's count??

这本书的意思是:

Decrements p's reference count and increments q's count, deletes p's existing memory if p's count goes to 0.

如果 p 已经指向某个东西,那么在 p 指向与 q 相同的东西之前,该计数将递减。


如果不是这个代码:

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

你有这个代码:

std::shared_ptr<int> sp1 = std::make_shared<int>(10); // use_count() == 1
decltype(sp1) sp2 = std::make_shared<int>(5); // // use_count() == 1

然后你会看到你做 sp2 = sp1; 的那一刻 sp2use_count() 将首先下降到 0 从而删除保存整数的内存 5,然后开始指向保存整数 10 的内存,use_count() 现在是 2,因为 sp1sp2 现在都是指向它。