C++;初级读物5版:计数引用和基础指针 < C++ > 5版。第12章std::shared_ptr据说: p = q;
“C++;初级读物5版:计数引用和基础指针 < C++ > 5版。第12章std::shared_ptr据说: p = q;,c++,c++11,shared-ptr,C++,C++11,Shared Ptr,“p和q是共享的\u 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
p
和q
是共享的\u 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
具有相同的sp2
?如上所述,该赋值递减use\u count
的参考计数,递增p
的计数q
- 我也不知道
和sp1
中的底层指针除了是同一类型之外,哪种情况可以相互转换:sp2
std::shared_ptr<int> spi = std::make_shared<int>(0); std::shared_ptr<short> sps = spi; // error
std::shared_ptr spi=std::make_shared(0); std::shared_ptr sps=spi;//错误
short
可以转换为int
,但为什么它不起作用呢?正如我所知,它类似于容器:容器类型(类型名称和元素类型)必须相同。然后我不明白书中的这一点:“p
和q
是shared\u ptr
的指针,可以相互转换。”
为什么sp1和sp2具有相同的使用计数
您有两个共享指针,sp1
和sp2
,指向同一资源
因此,两个共享指针都指示资源的“使用计数”为2
如上所述,该赋值递减p的参考计数,递增q的计数 如果
p
最初指向的是其他东西,就可以了。现在,您将少了一个指向其他资源的共享指针
我认为[
int
]可以转换为[short
],但为什么它不起作用呢
是的,int
可以转换为short
。也就是说,您可以获取一个int
并创建一个新的short
,它保存相同的值(如果在类型的范围内)
但是short
不是int
,因此如果您有int
,则不能使用short*
指向它
这与共享指针无关。试试看:
int x = 0;
short* y = &x;
你会发现你不能拥有它,也没有意义去拥有它
正如我所知,它类似于容器:容器类型(类型名称和元素类型)必须相同 不,这跟那没什么关系
我不理解书中的这一点:“p和q是共享的,它们持有可以相互转换的指针。” 有些指针是可转换的,例如
派生的*
到基的*
他的意思是,“在这个例子中,假设p
和q
都是shared\u ptr
s,或者是完全相同的类型,或者至少是可转换的类型,因此=
是合法的”
为什么sp1和sp2具有相同的使用计数
您有两个共享指针,sp1
和sp2
,指向同一资源
因此,两个共享指针都指示资源的“使用计数”为2
如上所述,该赋值递减p的参考计数,递增q的计数 如果
p
最初指向的是其他东西,就可以了。现在,您将少了一个指向其他资源的共享指针
我认为[
int
]可以转换为[short
],但为什么它不起作用呢
是的,int
可以转换为short
。也就是说,您可以获取一个int
并创建一个新的short
,它保存相同的值(如果在类型的范围内)
但是short
不是int
,因此如果您有int
,则不能使用short*
指向它
这与共享指针无关。试试看:
int x = 0;
short* y = &x;
你会发现你不能拥有它,也没有意义去拥有它
正如我所知,它类似于容器:容器类型(类型名称和元素类型)必须相同 不,这跟那没什么关系
我不理解书中的这一点:“p和q是共享的,它们持有可以相互转换的指针。” 有些指针是可转换的,例如
派生的*
到基的*
他的意思是,“在这个例子中,假设p
和q
都是shared\u ptr
s,或者是完全相同的类型,或者至少是可转换的类型,因此=
是合法的”
为什么sp1
和sp2
具有相同的使用计数()?上面说的是
赋值递减p
的参考计数,递增q
的计数
这本书的意思是:
减少p
的参考计数和
增加q
的计数,如果p
的计数变为0,则删除p
的现有内存
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
std::shared_ptr sp1=std::make_shared(10);
decltype(sp1)sp2=nullptr;
您有以下代码:
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
std::shared_ptr sp1=std::make_shared(10);//使用_count()==1
decltype(sp1)sp2=std::使_共享(5);//使用_count()==1
然后你会看到你做sp2=sp1的那一刻
即sp2
的use_count()
将首先降至0,从而删除保存整数5
的内存,然后开始指向保存整数的内存