智能指针


智能指针

1、在可以使用 boost 库的场合下,拒绝使用 std::auto_ptr,因为其不仅不符合 C++ 编程思想,而且极容易出错。
(1)尽量不要使用“operator=”。如果使用了,请不要再使用先前对象。
(2)记住 release() 函数不会释放对象,仅仅归还所有权。
(3)std::auto_ptr 最好不要当成参数传递(读者可以自行写代码确定为什么不能)。
(4)由于 std::auto_ptr 的“operator=”问题,有其管理的对象不能放入 std::vector 等容器中。
(5)……

2、在确定对象无需共享的情况下,使用 boost::scoped_ptr(当然动态数组使用 boost::scoped_array)。
3、在对象需要共享的情况下,使用 boost::shared_ptr(当然动态数组使用 boost::shared_array)。
4、在需要访问 boost::shared_ptr 对象,而又不想改变其引用计数的情况下,使用 boost::weak_ptr,一般常用于软件框架设计中。
5、最后一点,也是要求最苛刻一点:在你的代码中,不要出现 delete 关键字(或 C 语言的 free 函数),因为可以用智能指针去管理。

关于_RecordsetPtr和_ConnectionPtr有时调用release()之后报错内存泄漏。

个人推测因为_RecordsetPtr和_ConnectionPtr是智能指针(内部可能使用的是std::auto_ptr)使用赋值操作符B=A时

1、获得A内存操作权限,但计数器addref也并未加1,然后调用B.Close(),调用B.Release()就会出现报错,因为计数器并未加1。如果传一个函数中释放比如Free(xxxPtr pPtr)(我们就会发程序自动调用了B.AddRef())这样再调用调用B.Close(),调用B.Release()就不

会出现报错。
所有使用赋值操作符B=A时 建议也多写一个B.AddRef() 这样就直接调用B.Close(),调用B.Release()就不会报错。或者写个释放函数把这个智能指针丢进去比如
(1)
B = A或Fun();
B.AddRef();
B.Close()
B.Release()
B=NULL;

void Free(xxxPtr pPtr)
{
  if(pPtr != NULL )
    {
    pPtr->Close();
    pPtr->Release();
    pPtr == NULL;
   }
 }

或者采用这种方式得到智能指针对象
Fun(xxxPtr &pPtr)


(2)虽然下面这种也可以解决问题 但是不建议这样做。
pPtr->Close();
try
{
   pPtr->Release();
  pPtr == NULL;
}
catch()
{
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值