智能指针
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()
{
}