自动指针问题
我是C ++的新手,对auto_ptr有点困惑。
我有一个内部有一个静态auto_ptr的类。
static std::auto_ptr<MyCompany::CConnection> con = std::auto_ptr<MyCompany::CConnection> (util::getDBConnection() );
Util :: getDBConnection()实现:
CConnection* util::getDBConnection(){
try
{
cout<< &MyCompany::GetFermatConnection();
return &MyCompany::GetFermatConnection();
}
catch(...)
{
//connect to local DB
throw;
}
}
但是,当我的程序完成后,在自动指针的析构函数期间,它总是在内存中遇到异常。
~auto_ptr()
{ // destroy the object
if (_Myptr != 0)
delete _Myptr; // exception in this line.
}
例外情况是“TestDLL.exe中的0x00000001800024e8未处理的异常:0xC0000005:访问冲突读取位置0xffffffffffffffff”。
据我所知,auto_ptr会在任何内存到达其作用域的末尾时尝试释放内存。 但是,在这种情况下,我不知道哪里出了问题。 有谁知道可能的原因是什么?
虽然你已经展示了util::getDBConnection
的实现,但它并没有真正回答这个问题,也就是它返回的内容是否最终是一个用new
分配的指针。
如果是这样,那么当你试图删除那个指针时会出现一个错误信息,表明你的堆可能已经被损坏(很可能在一些完全不相关的代码中)。
如果它返回的是没有用new
分配的东西,那么问题就更简单了 - 因为auto_ptr
在指针上使用delete
,所以它只能用于与new
分配的东西。 在任何其他方式分配的指针上使用它将给UB。
我不知道你的代码的细节,但我猜测有代码在删除它们时将指针设置为-1,并且崩溃来自同一指针上的双重删除。
COM和auto_ptr可能不应该混合,这是它看起来正在发生给定的代码的COM ::部分。
auto_ptr更像是一个'强指针' - 它拥有它并删除它,除非它被撕掉。
COM使用ref计数模型。 使用引用计数1创建对象。任何新引用都应该是AddRef'd,当不再需要时,Release()。
相反,看看一个COM特定的智能指针。
抱歉,如果我错误地猜测COM方案。
链接地址: http://www.djcxy.com/p/79939.html上一篇: Auto Pointer Issue