C++ 自动指针问题 static std::auto_ptr<MyCompany::CConnection> con = std::auto_ptr<MyCompany::CConnection> (util::getDBConnection() );

C++ 自动指针问题 static std::auto_ptr<MyCompany::CConnection> con = std::auto_ptr<MyCompany::CConnection> (util::getDBConnection() );,c++,auto-ptr,C++,Auto Ptr,我有一个类,里面有一个静态的auto_ptr static std::auto_ptr<MyCompany::CConnection> con = std::auto_ptr<MyCompany::CConnection> (util::getDBConnection() ); 该异常是TestDLL.exe中0x00000001800024e8处的未处理异常:0xC0000005:访问冲突读取位置0xFFFFFFFFFF 我知道auto_ptr将在其作用域结束时尝试释

我有一个类,里面有一个静态的auto_ptr

static std::auto_ptr<MyCompany::CConnection> con = std::auto_ptr<MyCompany::CConnection> (util::getDBConnection() );
该异常是TestDLL.exe中0x00000001800024e8处的未处理异常:0xC0000005:访问冲突读取位置0xFFFFFFFFFF

我知道auto_ptr将在其作用域结束时尝试释放任何内存。
但是,在这种情况下,我不知道出了什么问题。有人知道可能的原因吗?

我不知道您的代码的细节,但我猜有代码在删除指针时将指针设置为-1,崩溃是由于对同一指针进行了双重删除

COM和auto_ptr可能不应该混合使用,考虑到代码的COM::部分,这似乎是正在发生的事情

auto_ptr更像是一个“强指针”——它拥有并删除它,除非它被撕掉

COM使用引用计数模型。对象是使用引用计数1创建的。任何新的参考都应该添加参考,当不再需要时,发布

相反,请查看COM特定的智能指针


如果我对COM场景的猜测不正确,我深表歉意。

我不知道您的代码的细节,但我想可能是有代码在删除它们时将指针设置为-1,并且崩溃是由于对同一指针进行了双重删除

COM和auto_ptr可能不应该混合使用,考虑到代码的COM::部分,这似乎是正在发生的事情

auto_ptr更像是一个“强指针”——它拥有并删除它,除非它被撕掉

COM使用引用计数模型。对象是使用引用计数1创建的。任何新的参考都应该添加参考,当不再需要时,发布

相反,请查看COM特定的智能指针


如果我对COM场景的猜测不正确,我深表歉意。

尽管您已经展示了util::getDBConnection的实现,但它并没有真正回答这个问题,即它返回的是否最终是一个分配了new的指针

如果是,那么当您尝试删除该指针时会出现一条错误消息,表明您的堆可能已损坏,很可能是在一些完全不相关的代码中


如果它返回的是未分配给new的内容,那么问题就更简单了——因为auto_ptr在指针上使用delete,它只能用于分配给new的内容。在以任何其他方式分配的指针上使用它将得到UB。

尽管您已经展示了util::getDBConnection的实现,但它并没有真正回答这个问题,即它返回的是否最终是一个分配了new的指针

如果是,那么当您尝试删除该指针时会出现一条错误消息,表明您的堆可能已损坏,很可能是在一些完全不相关的代码中


如果它返回的是未分配给new的内容,那么问题就更简单了——因为auto_ptr在指针上使用delete,它只能用于分配给new的内容。在以任何其他方式分配的指针上使用它将得到UB。

自动ptr是否正确初始化?您能在util::getDBConnection中放置一个断点并查看它返回什么吗?util::getDBConnection是否有可能返回-1?断点显示util.getDBConnection返回000000000 2899A20。在我看来,使用静态auto_ptr可能不是您想要的,因为它根本不提供任何生命周期管理。它只会在程序的最后被销毁,这种情况下,您首先不需要自动ptr。唯一有用的地方是在使用自定义删除程序时,但这里的情况似乎不是这样。从getDBConnection的实现来看,DBConnection的内存没有使用new分配。auto_ptr是否正确初始化?您能在util::getDBConnection中放置一个断点并查看它返回什么吗?util::getDBConnection是否有可能返回-1?断点显示util.getDBConnection返回000000000 2899A20。在我看来,使用静态auto_ptr可能不是您想要的,因为它根本不提供任何生命周期管理。它只会在程序的最后被销毁,这种情况下,您首先不需要自动ptr。唯一有用的地方是在使用自定义删除程序时,但这里的情况似乎不是这样。从getDBConnection的实现来看,DBConnection的内存没有使用new.sorry分配。COM=公司名称。我有一个政策,以掩盖我的公司名称之前张贴。我已经更新了我的问题,以消除任何困惑,无需担心。假设代码成功地使用了指针,我仍然会赌double delete/free,但不太确定在哪里。如果可能,在CConnection的析构函数中添加断点-h
实际上,这种类型的实例并不多,这将有助于跟踪问题。对不起。COM=公司名称。我有一个政策,以掩盖我的公司名称之前张贴。我已经更新了我的问题,以消除任何困惑,无需担心。假设代码成功地使用了指针,我仍然会赌double delete/free,但不太确定在哪里。如果可能的话,在CConnection的析构函数中添加一个断点——希望这种类型的实例不多,这将有助于跟踪问题。
~auto_ptr()
    {   // destroy the object
    if (_Myptr != 0)
        delete _Myptr; // exception in this line.
    }