跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • c++中引用和智能指针的简单问题
未分類
5 2 月 2021

c++中引用和智能指针的简单问题

c++中引用和智能指针的简单问题

資深大佬 : ruokw 2

传入对象引用,例如 json-value ( A )。现在想把它包装成新对象( B{A})返回,但是底层指向同一个对象。而且 B 要支持无参构造。使用智能指针去包装 A 会出现超过域后过早释放空间的问题。想问下这种情况下有什么好的解决方法吗?
大佬有話說 (23)

  • 資深大佬 : yianing

    那在有参构造的时候传入智能指针的拷贝不就行了吗?

  • 主 資深大佬 : ruokw

    @yianing 现在问题是 A 应该是在 B 之后才会被释放,但是 B 保存 A 的智能指针,在 B 死亡时会提前释放掉 A 。

  • 資深大佬 : yianing

    @ruokw B 死亡时只会将 A 的引用数减一,并不会释放掉指针指向的内存吧,只有引用数变为 0 的时候才会真正释放内存

  • 資深大佬 : wutiantong

    你没有描述清楚你的问题

  • 主 資深大佬 : ruokw

    @wutiantong 补充了

  • 主 資深大佬 : ruokw

    @yianing 补充了

  • 資深大佬 : wevsty

    首先把传入的引用转换为智能指针是一种强烈不推荐的做法。
    其次,shared_ptr 在超过生存周期的时候会自动对引用计数减 1,如果引用计数为 0 就会去 delete 管理的对象。如果不想 shared_ptr 指针去 delete 这个对象,要不然增加引用计数,要不然就延长 shared_ptr 的生存周期。

  • 資深大佬 : yianing

    好家伙,都用智能指针了为什么还要去获取裸指针呢?

  • 主 資深大佬 : ruokw

    @wevsty 这个能明白。现在的问题是实际上 B 被作为类型的集合,用来统一一类函数的返回类型,B{int string long A},如果 B 里面 A 用引用,就又意味着 B 不能无参构造了。 所以现在有啥好的方法? 还是说只能整个重新设计?

  • 主 資深大佬 : ruokw

    @yianing 你是说 shared_ptr(&a)么? 至少我现在在 mxvc2011 里面对引用 a 构造智能指针要用&a 。这点也比较难理解,为啥引用还有指针?

  • 資深大佬 : yianing

    @ruokw 智能指针创建的正确使用姿势是 std::make_shared,你这把传进来的实例引用取地址绝对有问题啊

  • 資深大佬 : imjamespond

    可以用 weak ptr 啊。。。

  • 主 資深大佬 : ruokw

    @yianing 这个也能明白,但是现在情况是 B 不仅包装包装 a 而是包装 a 的子对象比方说 a 是 json::Value ,b=shared_ptr(a[“num”])。 这时候可能光 a 是智能指针都不够

  • 主 資深大佬 : ruokw

    @imjamespond 用 weak 还是得先有 shared 哈,有 shared 就又回到最初的说的了

  • 資深大佬 : hazardous

    使用 shared_ptr 第二个参数:自定义 deletor

  • 資深大佬 : hazardous

    还有个问题是很难保证传入 A 的引用一定是 new 出来的对象,如果是个栈上对象那 shared_ptr 释放的时候就崩了。

  • 主 資深大佬 : ruokw

    @hazardous 我把 deletor 设置成空,最原始的 a 在栈上,现在只是说用智能指针代替引用。在我现在这个场景应该够用了。谢谢你了哈

  • 資深大佬 : wutiantong

    主这 c++纯属瞎写啊。。。

    首先我们有 enable_shared_from_this ( https://en.cppreference.com/w/cpp/memory/enable_shared_from_this ),
    其次我们有 aliasing constructor for shared_ptr ( https://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr #8 )

  • 資深大佬 : mainjzb

    ..你已经把生死权交给 b 了。
    所以 b 死了,拉着 a 一起死很正常。
    不想交给 b 就用普通指针。所以用智能指针的意义何在。

  • 主 資深大佬 : ruokw

    @wutiantong 哈哈 新手上路嘛,我看看你说的哈

  • 資深大佬 : mainjzb

    要么 a 从一开始就用 share 指针。
    要么自己管理,都不用智能指针

  • 主 資深大佬 : ruokw

    @mainjzb 后来想想也是。。。蠢了╰(*´︶`*)╯ 哈哈

  • 資深大佬 : nicebird

    初学者吧,低级错误。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具