繁体   English   中英

尝试访问向量中对象的指针时出现无效的访问错误

[英]Invalid access error when trying to access a pointer to an object in a vector

我在类中有一个方法,它获取指向另一个对象(另一个类)的指针,并将一个对象(另一个不同的类)添加到一个向量中,该向量是第一个对象的成员变量(作为另一个对象传递的对象)一个参数)。 这是代码:

ObstacleManager::ObstacleManager(Application *lApp)
{
    app=lApp;
    GLfloat obstacleVerts[12]={
    -0.1f,-0.2f,0.0f,
    0.1f,-0.2f,0.0f,
    -0.1f,0.2f,0.0f,
    0.1f,0.2f,0.0f
    };
    StandardObstacle obstacle(obstacleVerts,-0.7f,0.0f,4);
    obstacle.manager=this;
    lApp->characters.push_back(&obstacle);
}

我认为问题在于障碍对象不应该被释放,因为如果我改变代码并用“new”创建障碍物(如果你用new创建一个对象,你必须手动删除它,不要你呢?)它的工作原理。 像这样:

ObstacleManager::ObstacleManager(Application *lApp)
{
    app=lApp;
    GLfloat obstacleVerts[12]={
    -0.1f,-0.2f,0.0f,
    0.1f,-0.2f,0.0f,
    -0.1f,0.2f,0.0f,
    0.1f,0.2f,0.0f
    };
    StandardObstacle *obstacle=new StandardObstacle(obstacleVerts,-0.7f,0.0f,4);
    obstacle->manager=this;
    lApp->characters.push_back(obstacle);
}

有没有办法防止这种情况发生?

您将本地对象的地址传递给向量,一旦构造函数返回,本地对象就不存在,然后您的向量有一个指向无效内存的指针。

您必须使对象保持不变,可能的方法是:
只需按值或按下对象即可
使用动态分配的对象,而不是原始指针使用像shared_ptr这样的智能指针作为向量元素类型。

是的,您可以使用new创建对象,也可以使用智能指针。

你的直觉是正确的:

ObstacleManager::ObstacleManager(Application *lApp)
{
    //...
    StandardObstacle obstacle(obstacleVerts,-0.7f,0.0f,4);
    obstacle.manager=this;
    lApp->characters.push_back(&obstacle);
}   //obstacle is destroyed here

对象obstacle在自动存储中创建。 它的生命周期受其封闭范围的限制,该范围是构造函数中的结束括号。

因此,您获取对象的地址,将其推入向量,然后对象被销毁。 这意味着,在向量内部,您现在有一个悬空指针。

这肯定会导致未定义的行为

你可以使用new ,并确保清理内存。 或者你可以使用智能指针 - 这是更多的C ++ - 而不是原始指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM