使用shared_ptr调用make_shared(Args ...)c ++

时间:2016-07-27 15:33:56

标签: c++ shared-ptr

我有一种奇怪的行为,在花了几个小时之后,我终于来了。 我有一个类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类中(只是剪掉代码),然后在它们之间插入一个包装器,以获得更多的代码清晰度,数百行。是的,以前它曾经工作过。

感谢你的时间提前

0 个答案:

没有答案