运行时错误:将 .push_back() 与 std::vector 一起使用时访问冲突?

Posted

技术标签:

【中文标题】运行时错误:将 .push_back() 与 std::vector 一起使用时访问冲突?【英文标题】:Runtime error: Access violation when using .push_back() with a std::vector? 【发布时间】:2009-11-26 14:55:31 【问题描述】:

我有一个向量,由std::vector<LPDIRECT3DTEXTURE9> textures; 定义 稍后,我将LPDIRECT3DTEXTURE9 对象传递给它,就像textures.push_back(texture); 这样的示例:

void SpriteManager::AddSprite(float x, float y, float z, LPDIRECT3DTEXTURE9 texture)

    //snip
    textures.push_back(texture);
    //snip

这会导致运行时错误。它在size() 函数处中断了向量类。为什么会发生这种情况?

编辑:

D3DXVECTOR3 对象的向量上执行相同的操作时,我也遇到了同样的问题。由于LPDIRECT3DTEXTURE9 是指向IDIRECT3DTEXTURE9 的指针,我应该改用它吗?

【问题讨论】:

你确定这就是你所做的一切吗?您是否尝试过编译您的问题的简化版本?也许你真正的问题是切片问题(如果你以某种方式使用继承) 切片问题?没有什么是从向量继承的。在我添加这个向量之前,这段代码编译并运行良好,是的。 没关系,切片问题只有在你有一个对象向量时才会发生。 【参考方案1】:

好吧,由于 LPDIRECT3DTEXTURE9 的匈牙利名称是指针而不是对象(正如您所指的那样),我的猜测是您正在传递无效指针,这些指针已经在您可怜的矢量对象上执行了 fandango你调用 push_back()。

我可能错了,但从您提供的信息中可以看出这一点。而且,是的, push_back() 只有在内存不足或尝试在向量中使用不可复制或不可分配的对象时才会失败,而不是通过访问冲突。

【讨论】:

一个指针向量并不关心它持有的指针是否无效。 不。但是如果指针和对象混淆了,我会开始在周围的某个地方寻找无效的指针,正如你所建议的那样。 这很有趣。但是,指针事先没有任何反应。我创建了我知道是有效的纹理指针,并将它传递给函数以使用 .push_back()。在此过程中没有其他任何事情发生。 我怀疑这是指针是否无效不会导致访问冲突的答案,因为 push_back 不会写入正在存储的项目。 尽管如此,您似乎在某处破坏了向量,无论是通过存储的指针还是其他方式。当您将指针称为对象时,我只是怀疑...尝试通过例如更改纹理矢量(SpriteManager 的成员?)的位置在它周围添加 dummy char[512] 数据结构,看看你是否在同一个地方得到同样的错误。【参考方案2】:

您的矢量已损坏。我建议在其内部放置一个数据观察点,以查看它(在调试器中)踩踏的是什么。

【讨论】:

【参考方案3】:

到目前为止,最常见的原因是您实际上没有向量。在这种情况下,textures 似乎是SpriteManager 类的成员。因此,这表明您实际上也没有 SpriteManager 对象。 this 指针有效吗?

【讨论】:

以上是关于运行时错误:将 .push_back() 与 std::vector 一起使用时访问冲突?的主要内容,如果未能解决你的问题,请参考以下文章

我在尝试将多个值 push_back 到向量时遇到错误。我究竟做错了啥? [关闭]

Microsoft Visual Basic - 运行时错误“3075:查询表达式“1st”、“A”、1-Jan-15'、“1”中的语法错误(缺少运算符))

在某些循环内使用 vector.push_back 时出现分段错误

push_back() 时出现分段错误

vector.push_back() 方法调用在 C++ 中不起作用

Vector::push_back() 给出读取访问冲突