我是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会在到达其范围的末尾时尝试释放任何内存。 但是,在这种情况下,我不知道出了什么问题。有谁知道可能的原因是什么?
答案 0 :(得分:2)
我不知道你的代码的具体细节,但我猜想有一些代码在删除它们时将指针设置为-1,并且崩溃来自同一指针的双重删除。
COM和auto_ptr可能不应该是混合的,这是在代码的COM ::部分给出的情况下发生的。
auto_ptr更像是一个“强指针” - 它拥有它并删除它,除非它被撕掉。
COM使用ref计数模型。使用引用计数1创建对象。任何新引用都应为AddRef'd,当不再需要时,Release()。
请查看类似COM的特定智能指针,如this。
如果我错误地猜测COM场景,请道歉。
答案 1 :(得分:2)
虽然你已经展示了util::getDBConnection
的实现,但它并没有真正回答这个问题,即它返回的内容最终是一个用new
分配的指针。
如果是,那么当您尝试删除该指针时出现错误消息表明您的堆可能已损坏(很可能在某些完全不相关的代码中)。
如果它返回的东西没有用new
分配,那么问题就更简单了 - 因为auto_ptr
在指针上使用delete
,它只能用于某些东西用new
分配的。在任何其他方式分配的指针上使用它将给UB。