【发布时间】: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<GameObject> 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->m_characterInGame = std::dynamic_pointer_cast<PlayerCharacter>(GameObjectFactory::createGameObject(characterInfo->m_typeId));
有人知道这里发生了什么吗?也许我错过了一些明显的东西。
编辑:
m_characterInGame 定义如下:
character_ptr m_characterInGame;
还有character_ptr:
typedef std::shared_ptr<PlayerCharacter> character_ptr;
【问题讨论】:
-
GameObjectManager::addObject()长什么样子? -
@TheBadger 不相关。我只是检查了没有调用它,问题仍然存在。我将编辑问题。
-
@DavidSchwartz 请看我编辑的问题。我添加了
m_characterInGame的定义。 -
当你调用这个时
account->m_characterInGame是空的吗?也许前一个实例的析构函数崩溃了?您可以通过在调用createGameObject之前放置account->m_characterInGame.reset();进行测试,看看它是否在那里崩溃。 -
那么很可能您的代码中存在未显示的错误或一些奇怪的平台/编译器/库问题。看看您是否可以制作一个独立的示例来复制该问题。或者尝试使用不同的编译器。
标签: c++ c++11 visual-studio-2012 visual-c++ shared-ptr