c++中的指针错误

Pointer Errors in C++

本文关键字:错误 指针 c++      更新时间:2023-10-16

我有一个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对象驻留在与分配时相同的位置…问题似乎是std::vector对象。不知何故,存储在vector中的内存地址更改为无法强制转换为PIXEL类型的任意位置…导致异常…

在我的应用程序中可能会发生什么导致std::vector对象中的值无效?这个矢量一次存储了许多像素,之后不再改变。

如果您确定向量中的实际指针值已经改变(您已经通过将指针值输出到控制台或文件(前后)来验证这一点),那么某些东西正在破坏您的向量。否则你可能已经释放了内存。

如果指针的值发生了变化,常见的情况有:

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

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

  • 多线程环境中的争用条件——你可能需要锁来确保对vector的原子访问;

  • 程序中的逻辑错误在对vector进行操作时使其混乱;

  • 你做了一些讨厌的事情,破坏了堆。

如果指针值没有改变,那么一些常见的情况是:

  • 您已经将您的PIXEL对象返回到OS某处(可能在析构函数中删除);

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

  • 你做了一些讨厌的事情,破坏了堆。