指针(4)智能指针的使用

本文详细介绍了C++中智能指针shared_ptr的作用与使用方法,包括解决原始指针复制问题、非内存资源管理及常见错误示例。并强调了在使用过程中需要注意的事项,例如避免对空指针进行解引用等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

why shared_ptr
1)如果指针作为类成员时,使用shared_ptr封装原始指针,解决了复制类对象出现的问题(相较原始指针)。
   如果是非内存资源(比如:互斥器),可以在构造时再传一个删除器(deleter)参数(shared_ptr可以,auto_ptr不能),因为shared_ptr缺省行为是“当引用计数为0时,删除其所指物”,那不是我们所想要的行为。
2)用于函数内部创建的堆对象的堆栈指针,作为函数返回值


how shared_ptr使用:《effective c++》item29
shared_ptr使用注意:
  • 空指针解引用会运行时错误,触发宏BOOST_ASSERT(px != 0);
vs下:
#else
# include <assert.h> // .h to support old libraries w/o <cassert> - effect is the same
# define BOOST_ASSERT(expr) assert(expr)
#endif
typename boost::detail::sp_dereference< T >::type operator* () const
    {
        BOOST_ASSERT( px != 0 );
        return *px;
    }


class A
{
public:
      A():i_(0),j_(0){}
private:
       int i_;
       int j_;
};

int main()
{
      shared_ptr<A> ptr1;
      A obj(*ptr1);

      system( "pause");
       return 0;
}

  •  shared_ptr的定义问题
shared_ptr<int> p1(new int(100)); 而不是 shared_ptr<int*> p1( new int (100)); //编译错误,应该为<int>

  • 创建时传参为栈对象指针,或reset时传栈对象指针。离开作用域,即析构函数调用时,会引发运行时错误
A obj;
shared_ptr<A> ptr2(&obj); //运行时CRT 错误
A obj;
shared_ptr<A> ptr1( new A());
ptr1.reset(&obj); //运行时CRT 错误。
                                   //如果是空指针即0,或原指针值,也会引发assert错误


  • 智能指针构造时,不能用动态数组作为参数构造。
           how :若要封装动态数组,可以使用vector,string,scoped_arry,shared_array
//effective c++ 》电子版p95
      shared_ptr< int> pi(new int[1024]);  //可能会运行时错误。因为 shared_ptrdelete 析构而不是delete[]。若要封装动态数组,可以使用vector,string,scoped_arry,shared_array
      auto_ptr<string> ps( new string[10]); // 可能会运行时错误。因为 auto_ptrdelete 析构而不是delete[]。若要封装动态数组,可以使用vector,string,scoped_arry,shared_array

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值