向unordered_map添加unique_ptr时'this was nullptr'
'this was nullptr' when adding unique_ptr to unordered_map
我正在创建一个简单的演示项目,但我无法将unique_ptr
添加到无序列表中,不知何故它添加了键而不是指针,后来当我尝试在指针上调用方法时,我得到"这是nullptr错误"。
我有一个基类Scene
负责存储指针并将它们添加到地图中,如下所示:
void Scene::addGameObject(const std::string& name, const GameObjectParams& params)
{
m_objects.try_emplace(name, std::make_unique<GameObject>(params));
}
bool Scene::containsGameObject(const std::string& name)
{
if (m_objects[name] != NULL)
return true;
return false;
}
GameObject& Scene::getGameObject(const std::string& name)
{
auto it = m_objects.find(name);
if (it != m_objects.end())
return *it->second;
}
void Scene::drawScene()
{
for (const auto& object : m_objects)
object.second->draw(); // <--------here the error gets thrown
}
如果我从具有scene
作为成员的类调用此方法,则每个示例都可以正常工作:
//GameLayer.h
class GameLayer
{
private:
// GameScene is derived class from Scene
GameScene m_gameScene;
};
//GameLayer.cpp
m_gameScene.addGameObject(
"player",
{
Vector3f(0.0f, 0.0f, 1.0f),
Vector3f(100.0f, 70.0f, 1.0f),
Quaternion(),
Vector4f(1.0f),
fighter
}
);
但是现在当我尝试从派生类本身添加一个新对象时,它会添加键但没有指针
void GameScene::spawnLaser(Vector3f pos)
{
for (int i = 0; i < 100; i++)
{
std::string name = std::to_string(i);
if (!this->containsGameObject(name))
{
m_lasers.emplace_back(name);
this->addGameObject(
"laser",
GameObjectParams {
Vector3f(0.0f, 0.0f, 1.0f),
Vector3f(100.0f, 70.0f, 1.0f),
Quaternion(),
Vector4f(1.0f),
nullptr
}
);
return;
}
}
}
GameObject
是应使用std::make_unique
创建的对象
GameObject::GameObject(const GameObjectParams& params)
: m_position(params.position.x, params.position.y, params.position.z),
m_scale(params.scale.x, params.scale.y, params.scale.z),
m_rotation(),
m_texture(params.texture),
m_color(params.color)
{
}
void GameObject::setTexture(cheetah::Texture* texture)
{
m_texture = texture;
}
void GameObject::setPosition(const cheetah::Vector3f& position)
{
m_position.x = position.x;
m_position.y = position.y;
m_position.z = position.z;
}
void GameObject::translate(const cheetah::Vector3f& position)
{
m_position.x += position.x;
m_position.y += position.y;
m_position.z += position.z;
}
void GameObject::draw()
{
// 'this was nullptr' gets thrown here
if (m_texture != nullptr)
{
Renderer2D::drawQuad(DrawTexturedQuadParams{ m_position, m_scale, m_rotation, Vector4f(1.0f), m_texture });
}
else
{
Renderer2D::drawQuad(DrawQuadParams{ m_position, m_scale, m_rotation, m_color });
}
}
似乎make_unique
没有创建一个新对象,但我不知道为什么。
在此代码中:
bool Scene::containsGameObject(const std::string& name)
{
if (m_objects[name] != NULL)
return true;
return false;
}
如果地图中不存在name
,则地图的operator[]
将使用默认构造的std::unique_ptr
添加name
,该包含nullptr
。 您需要使用m_objects.find(name)
而不是m_objects[name]
:
bool Scene::containsGameObject(const std::string& name) const
{
return (m_objects.find(name) != m_objects.end());
}
在此代码中:
GameObject& Scene::getGameObject(const std::string& name)
{
auto it = m_objects.find(name);
if (it != m_objects.end())
return *it->second;
}
如果在映射中找不到name
,则返回值不确定。 您需要:
- 指针而不是引用,以便在找不到
name
时可以返回nullptr
(然后更新调用方以检查nullptr
(:
GameObject* Scene::getGameObject(const std::string& name)
{
auto it = m_objects.find(name);
if (it != m_objects.end())
return it->second.get();
return nullptr;
}
- 继续返回引用,但如果未找到
name
则引发异常:
GameObject& Scene::getGameObject(const std::string& name)
{
// std::unordered_map::at() throws std::out_of_range if the key is not found...
return *(m_objects.at(name)->second);
}
相关文章:
- 如何在自删除后将对象设置为nullptr
- 如何取消对nullptr的屏蔽,返回正确的对象
- C++ - "!pointer"和"pointer == nullptr"的区别?
- 将指针设置为"nullptr"并不能防止双重删除?
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 如何修复"error: ‘_1’ was not declared in this scope"?
- 为什么我的节点在我设置后被设置为 nullptr = 新节点?
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 哈希映射使用 nullptr c++ 初始化节点的动态数组
- 为什么我会收到"Run-Time Check Failure #2 - Stack around the variable 'pr' was corrupted"错误?
- wx通用目录控制错误"wxTheFileIconsTable was nullptr"
- 当设置为 const 变量时使用 nullptr
- 为什么"weak.lock()"返回"nullptr" "auto weak=std::make_shared<int>(42);"的定义?
- 检查类方法中是否(此 == nullptr)
- 为什么调试器引发"read access violation. this was nullptr"异常?
- 向unordered_map添加unique_ptr时'this was nullptr'
- 函数 AfxEndThread 中的读取访问冲突"pThread-> was nullptr"
- "Read Access Violation: This was nullptr" 以为我分配正确...?