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
的内存,然后开始指向保存整数的内存