C++11智能指针(四):创建shared_ptr对象

1、尽量不要使用相同的原始指针来创建多个shared_ptr对象,因为在这种情况下,不同的shared_ptr对象不会知道它们与其他shared_ptr对象共享指针。

这样会造成什么样的问题?

设想两个shared指针由相同的原始指针创建:

int *rawPtr = new int();
std::shared_ptr<int> ptr_1(rawPtr);
std::shared_ptr<int> ptr_2(rawPtr);


假设ptr_2超出范围,那么它将删除关联的原始指针,这样ptr1就会指向一个悬挂指针。

所以,当ptr_1超出范围,那么它将再次尝试删除相关的内存,这实际上是一个悬挂的指针。因此程序会崩溃。
实例:
#include <iostream>
#include <memory>


typedef struct Sample {
  Sample() {
    internalValue = 0;
    std::cout << "Constructor" << std::endl;
  }
  ~Sample() {
    std::cout << "Destructor" << std::endl;
  }
}Sample;


int main() {
  {
    Sample* rawPtr = new Sample();
    std::shared_ptr<Sample> ptr_1(rawPtr);
    {
      std::shared_ptr<Sample> ptr_2(rawPtr);
    }
    //由于ptr_2不知道另一个shared_ptr(即ptr_1)使用了相同的原始指针,
    //因此这里当ptr_2超出了作用域,并删除了与之关联的原始指针。
    //现在ptr_1在内部包含一个悬挂指针。 因此,当我们将超出范围,
    //它将再次尝试删除已经删除的原始指针,应用程序将崩溃。
  }


  return 0;
}

2、不要从栈而不是堆的内存中创建shared_ptr对象

检查下面的例子
#include <iostream>
#include <memory>

int main() {
  int x = 12;
  std::shared_ptr<int> ptr(&x);


  return 0;
}
shared_ptr期望与它关联的内存来自堆,因此当它超出范围时,如果引用计数为0,则删除关联的内存。但是在上面的例子中,我们将shared_ptr对象与栈上的内存关联,在其析构函数中,这个shared_ptr对象将调用这个栈内存上的delete操作。
由于这块内存是栈而不是堆,因此程序会崩溃。
因此,建议不要直接从原始指针创建shared_ptr,而是应该使用make_shared<>
std::shared_ptr<int> ptr_1 = make_shared<int>();
std::shared_ptr<int> ptr_2(ptr_1);



  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值