shared_ptr-运算符删除中的访问冲突

shared_ptr - access violation in operator delete

本文关键字:访问冲突 删除 运算符 ptr- shared      更新时间:2023-10-16

我有一个用Visual C++编写的应用程序,我在这个代码片段中遇到了访问违规错误:

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<GameObject> game_object_ptr;

而CCD_ 3类是从CCD_。

调用堆栈如下:

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->m_characterInGame = std::dynamic_pointer_cast<PlayerCharacter>(GameObjectFactory::createGameObject(characterInfo->m_typeId));

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

编辑:

m_characterInGame的定义如下:character_ptr m_characterInGame;

character_ptrtypedef std::shared_ptr<PlayerCharacter> character_ptr;

根据David Schwartz和The Badger的建议,我确实重建了项目,这就成功了。可能,该文件没有使用正常的构建进行重新编译。