自动指针问题

我是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

下一篇: best practice when returning smart pointers