C ++中的指针错误

时间:2014-03-20 01:35:38

标签: c++ memory vector

我有一个std :: vector类型,它包含指向应用程序中对象的指针。声明如下:

std::vector< PIXEL* > stgPixels;

...其中PIXEL是在我的应用程序中定义的结构(由2个浮点变量组成)。

编辑:向矢量添加像素:

// allocate a new pixel
PIXEL *pPixel = new PIXEL( D3DXVECTOR2( x, y ) );

// store pixel
stgPixels.push_back( pPixel );

在运行时我收到一个关于特定PIXEL指针的内存位置的未处理异常错误...我做了一些调试...... PIXEL对象驻留在分配时的相同位置......问题似乎成为std :: vector对象。不知何故,存储在向量中的内存地址会更改为某些任意位置,无法转换为我的PIXEL类型...导致异常......

我的应用程序中可能会导致std :: vector对象中的值变为无效?此向量一次存储多个像素,之后不再更改...我非常谨慎地更改数组中项目的值...

1 个答案:

答案 0 :(得分:1)

如果你确定向量中的实际指针值已经改变了(你已经通过将指针值输出到控制台或文件来验证这一点,无论是之前还是之后),那么有些事情就会被破坏你的矢量。否则你可能会释​​放那段记忆。

如果指针值已更改,则一些常见方案为:

  • 缓冲区溢出(或类似的未定义行为)已覆盖部分或全部矢量数据;

  • 缓冲区溢出(或类似的未定义行为)已覆盖了矢量本身,或者矢量是已被销毁的对象的一部分;

  • 多线程环境中的竞争条件 - 您可能需要锁定以确保对向量的原子访问;

  • 程序中的逻辑错误在向量上执行操作时弄乱了向量;

  • 你做了一件令人讨厌的事情并破坏了堆。

如果指针值已更改,则一些常见方案为:

  • 您已将PIXEL个对象返回到操作系统某处(可能在析构函数中删除);

  • PIXEL个对象已在堆栈上定义,并且已被销毁(存储指向临时对象的指针);

  • 你做了一件令人讨厌的事情并破坏了堆。