我有一个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对象中的值变为无效?此向量一次存储多个像素,之后不再更改...我非常谨慎地更改数组中项目的值...
答案 0 :(得分:1)
如果你确定向量中的实际指针值已经改变了(即你已经通过将指针值输出到控制台或文件来验证这一点,无论是之前还是之后),那么有些事情就会被破坏你的矢量。否则你可能会释放那段记忆。
如果指针值已更改,则一些常见方案为:
缓冲区溢出(或类似的未定义行为)已覆盖部分或全部矢量数据;
缓冲区溢出(或类似的未定义行为)已覆盖了矢量本身,或者矢量是已被销毁的对象的一部分;
多线程环境中的竞争条件 - 您可能需要锁定以确保对向量的原子访问;
程序中的逻辑错误在向量上执行操作时弄乱了向量;
你做了一件令人讨厌的事情并破坏了堆。
如果指针值未已更改,则一些常见方案为:
您已将PIXEL
个对象返回到操作系统某处(可能在析构函数中删除);
PIXEL
个对象已在堆栈上定义,并且已被销毁(即存储指向临时对象的指针);
你做了一件令人讨厌的事情并破坏了堆。