为什么“不要用get初始化另外一个智能指针”

hswshya 2017-03-09 11:08:43
书上说“不要用get初始化另外一个智能指针或为智能指针赋值”

shared_ptr<int> p(new int(42));
int *q=p.get();
{
shared_ptr<int> (q);
}

书上大概意思是:p和q指向相同的内存,但由于他们是相互独立创建的,所以各自的引用计数是独立的。

我想问下,为什么说他们是相互独立的呢,不是他们都指向同一个空间吗?为什么不能用get初始化智能指针呢?
...全文
545 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yelinCoder 2017-03-10
  • 打赏
  • 举报
回复
http://blog.csdn.net/xt_xiaotian/article/details/5714477 你可以详细看看
幻夢之葉 2017-03-10
  • 打赏
  • 举报
回复
是指向同一块内存,但是智能指针是两个不同的对象。 分别对p都有引用计数,但是却不是同步的。
vnvlyp 2017-03-10
  • 打赏
  • 举报
回复
引用 楼主 hswshya 的回复:
为什么说他们是相互独立的呢,不是他们都指向同一个空间吗?
因为shared_ptr除了有个指针之外,还有个包含计数器的结构,shared_ptr需要这个计数器才能知道什么时候应该释放指针。 你这么写,这个计数器并不会共享,会导致指针被释放多次的。 这样
shared_ptr<int> p(new int(42));
shared_ptr<int> q(p);
p和q才会共享计数器,只有其中一个被销毁的时候,他们的指针是不会被释放的。 所以get以及unique_ptr的release等方法需谨慎使用。
paschen 版主 2017-03-10
  • 打赏
  • 举报
回复
面向对象思考 2017-03-09
  • 打赏
  • 举报
回复
每一个shared_ptr维护一个独立的引用计数。 hared_ptr<int> (q);出了作用域以后,会释放q指向的内存,这时p管理的地址就变成无效的,等p再去释放内存就会有问题。

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧