我有一种奇怪的行为,在花了几个小时之后,我终于来了。 我有一个类DataModel,属于它的Wrapper。更确切地说,Wrapper实例对象具有DataModel的shared_ptr
Wrapper.h:
class Wrapper
{
shared_ptr<DataModel> model;
}
这个指针在constructeur中用nullptr初始化,以便在。之后初始化。
Wrapper.cpp:
Wrapper::Wrapper(/* few args here*/) : model(nullptr) { ... }
Wrapper::init(Args...)
{
model = std::make_shared<DataModel>(Args...)
}
Supervising类中的其他位置(包含一个包装器的shared_ptr)
SupervisingClass::SomeFunction()
{
Wrapper->init();
}
它引发了以下异常:
CSGeo.exe中0x000000013FB621C4的第一次机会异常:0xC0000005:访问冲突读取位置0x0000000000000018。 如果存在此异常的处理程序,则可以安全地继续该程序。
MyApp.exe!std::swap<std::_Ref_count_base * __ptr64>(std::_Ref_count_base * & _Left, std::_Ref_count_base * & _Right) Line 53 C++
MyApp.exe!std::_Ptr_base<DataModel>::_Swap(std::_Ptr_base<DataModel> & _Right) Line 316 C++
MyApp.exe!std::shared_ptr<DataModel>::swap(std::shared_ptr<DataModel> & _Other) Line 662 C++
MyApp.exe!std::shared_ptr<DataModel>::operator=(std::shared_ptr<DataModel> && _Right) Line 597 C++
MyApp.exe!Wrapper::init(const QStringList & recentProjects, bool insertNewVirtualProject) Line 83 C++
MyApp.exe!SupervisingClass::SomeFunction() Line 137 C++
如果我尝试在init函数中重置我的模型,它也会崩溃。任何的想法 ? 这次我迷路了。这不是我第一次遇到重置功能和shared_ptr的麻烦,我想我有点想念。为什么operator =被调用,考虑到指针没有被初始化,c ++应该只调用好的构造函数并转发Args,nope ???
可能有必要在之前添加,模型直接包含在Supervising类中(只是剪掉代码),然后在它们之间插入一个包装器,以获得更多的代码清晰度,数百行。是的,以前它曾经工作过。
感谢你的时间提前