自动指针问题

时间:2012-03-05 06:56:09

标签: c++ auto-ptr

我是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会在到达其范围的末尾时尝试释放任何内存。 但是,在这种情况下,我不知道出了什么问题。有谁知道可能的原因是什么?

2 个答案:

答案 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。