【问题标题】:shared_ptr - access violation in operator deleteshared_ptr - 运算符删除中的访问冲突
【发布时间】:2016-02-17 12:06:52
【问题描述】:

我有一个用 Visual C++ 编写的应用程序,我在这段代码 sn-p 中遇到访问冲突错误:

game_object_ptr GameObjectFactory::createGameObject(const int& id) {

    game_object_ptr fullObj;
    if(RANGE_PLAYERS_MIN <= id && RANGE_PLAYERS_MAX >= id) {
        fullObj = game_object_ptr(new PlayerCharacter());
    }

    if(fullObj) {
        return fullObj; // Crashes here...
    }

    return nullptr;
}

game_object_ptr 定义如下:typedef std::shared_ptr&lt;GameObject&gt; game_object_ptr;

PlayerCharacter 类派生自GameObject

调用栈如下:

msvcr110d.dll!operator delete(void * pUserData) Line 52 C++
MyApp.exe!GameObject::`scalar deleting destructor'(unsigned int)    C++
MyApp.exe!std::_Ref_count<GameObject>::_Destroy() Line 161  C++
MyApp.exe!std::_Ref_count_base::_Decref() Line 120  C++
MyApp.exe!std::_Ptr_base<GameObject>::_Decref() Line 347    C++
MyApp.exe!std::shared_ptr<GameObject>::~shared_ptr<GameObject>() Line 624   C++
MyApp.exe!GameObjectFactory::createGameObject(const int & id) Line 44   C++ 
(...)

所以看起来在删除 GameObject 对象时发生了崩溃,这表明它被删除了两次,但我不知道为什么它被删除,如果 - 据我了解 - 的引用计数共享资源不应降至 0,因为我在调用 createGameObject() 函数时会进一步传递所有权:

account-&gt;m_characterInGame = std::dynamic_pointer_cast&lt;PlayerCharacter&gt;(GameObjectFactory::createGameObject(characterInfo-&gt;m_typeId));

有人知道这里发生了什么吗?也许我错过了一些明显的东西。

编辑:

m_characterInGame 定义如下: character_ptr m_characterInGame;

还有character_ptrtypedef std::shared_ptr&lt;PlayerCharacter&gt; character_ptr;

【问题讨论】:

  • GameObjectManager::addObject() 长什么样子?
  • @TheBadger 不相关。我只是检查了没有调用它,问题仍然存在。我将编辑问题。
  • @DavidSchwartz 请看我编辑的问题。我添加了m_characterInGame 的定义。
  • 当你调用这个时account-&gt;m_characterInGame 是空的吗?也许前一个实例的析构函数崩溃了?您可以通过在调用createGameObject 之前放置account-&gt;m_characterInGame.reset(); 进行测试,看看它是否在那里崩溃。
  • 那么很可能您的代码中存在未显示的错误或一些奇怪的平台/编译器/库问题。看看您是否可以制作一个独立的示例来复制该问题。或者尝试使用不同的编译器。

标签: c++ c++11 visual-studio-2012 visual-c++ shared-ptr


【解决方案1】:

根据 David Schwartz 和 The Badger 的建议,我确实重建了项目,并且成功了。可能是文件没有通过正常的构建重新编译。

【讨论】:

    猜你喜欢
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    相关资源
    最近更新 更多