C++ primer 5 版:计数引用和底层指针
C++ primer 5 edition: count reference and underlying pointers
C++ primer 5 版。第12章std::shared_ptr
据说:
p = q;
"p
和 q
是 shared_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
为什么sp1
和sp2
有相同的use_count
?上面说那个赋值减少了p
的引用计数并增加了q
的计数??
我也不知道 sp1
和 sp2
中的底层指针可以相互转换而不是同一类型:
std::shared_ptr<int> spi = std::make_shared<int>(0);
std::shared_ptr<short> sps = spi; // error
我认为 short
可以转换为 int
但为什么它不起作用?我可能知道它类似于容器:容器类型(类型名称和元素类型)必须相同。然后我不明白书中的这一点:“p
和 q
是 shared_ptr
持有可以相互转换的指针。”
Why sp1 and sp2 has the same use_count?
您有两个共享指针,sp1
和 sp2
,指向同一个资源。
所以,两个共享指针都表明资源的"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_ptr
s, 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;
的那一刻 sp2
的 use_count()
将首先下降到 0 从而删除保存整数的内存 5
,然后开始指向保存整数 10
的内存,use_count()
现在是 2
,因为 sp1
和 sp2
现在都是指向它。
C++ primer 5 版。第12章std::shared_ptr
据说:
p = q;
"p
和 q
是 shared_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
为什么
sp1
和sp2
有相同的use_count
?上面说那个赋值减少了p
的引用计数并增加了q
的计数??我也不知道
sp1
和sp2
中的底层指针可以相互转换而不是同一类型:std::shared_ptr<int> spi = std::make_shared<int>(0); std::shared_ptr<short> sps = spi; // error
我认为 short
可以转换为 int
但为什么它不起作用?我可能知道它类似于容器:容器类型(类型名称和元素类型)必须相同。然后我不明白书中的这一点:“p
和 q
是 shared_ptr
持有可以相互转换的指针。”
Why sp1 and sp2 has the same use_count?
您有两个共享指针,sp1
和 sp2
,指向同一个资源。
所以,两个共享指针都表明资源的"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_ptr
s, either of the exact same type, or at least of convertible type, so that the =
is legal".
Why
sp1
andsp2
has the sameuse_count()
? And it is said above that that assignment decrementsp
's reference count and incrementsq
's count??
这本书的意思是:
Decrements
p
's reference count and incrementsq
's count, deletesp
's existing memory ifp
's count goes to0
.
如果 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;
的那一刻 sp2
的 use_count()
将首先下降到 0 从而删除保存整数的内存 5
,然后开始指向保存整数 10
的内存,use_count()
现在是 2
,因为 sp1
和 sp2
现在都是指向它。