关于std::auto_ptr的一个bug
Friday, November 24, 2006 6:31:16 AM
程序老是莫名其妙的崩溃, 由于涉及到多线程, 特别难调试, 就在我也临近崩溃时, 终于发现了问题所在. 为避免别人走同样的弯路, 作一个说明.
我的代码如下 :
// 头文件 b.h :
class A;
class B
{
void f();
std::auto_ptr impl_; } // 实现文件: B 的实现 b.cpp #include "b.h" //...详细实现 调试通过, 没有任何警告, 但运行时问题出来了: A对象释放时出错. 后来发现根本没有调用A::~A 改正方法: 在B.cpp中加入 #include "a.h" 它的错误是:根本没有A 的实现, 但 delete pA (pA为A的指针)却能通过编译, ----- 想起了boost的shared_ptr, 美好而令人怀念的checked_delete啊, 也许我们应该把std::auto_ptr 的析构函数中的 delete ptr 改为 boost:::checked_delete(ptr) 了. 它的实现也很简单: template <class T> inline void checked_delete(T* ptr) { typedef char type_must_be_complete[ sizeof(T)? 1: -1 ]; (void) sizeof(type_must_be_complete); delete ptr; } 来源: http://www.cppblog.com/eXile/archive/2006/11/23/15586.html
我的代码如下 :
// 头文件 b.h :
class A;
class B
{
void f();
std::auto_ptr impl_; } // 实现文件: B 的实现 b.cpp #include "b.h" //...详细实现 调试通过, 没有任何警告, 但运行时问题出来了: A对象释放时出错. 后来发现根本没有调用A::~A 改正方法: 在B.cpp中加入 #include "a.h" 它的错误是:根本没有A 的实现, 但 delete pA (pA为A的指针)却能通过编译, ----- 想起了boost的shared_ptr, 美好而令人怀念的checked_delete啊, 也许我们应该把std::auto_ptr 的析构函数中的 delete ptr 改为 boost:::checked_delete(ptr) 了. 它的实现也很简单: template <class T> inline void checked_delete(T* ptr) { typedef char type_must_be_complete[ sizeof(T)? 1: -1 ]; (void) sizeof(type_must_be_complete); delete ptr; } 来源: http://www.cppblog.com/eXile/archive/2006/11/23/15586.html
