C++ 中的指针错误
Posted
技术标签:
【中文标题】C++ 中的指针错误【英文标题】:Pointer Errors in C++ 【发布时间】:2014-03-20 01:35:38 【问题描述】:我有一个 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 对象中的值变得无效?该向量一次存储多个像素,之后不再更改...我对更改数组中项目的值非常小心...
【问题讨论】:
请粘贴向vector添加元素的代码。 "在我的应用程序中可能发生什么会导致 std::vector 对象中的值变得无效?"多重释放是最常见的罪魁祸首。运行 valgrind 看看会发生什么。 只是猜测:您是在存储临时对象而不是使用new
?
好点,@awesomeyi,希望您不介意我将其添加到我的答案列表中。
没有明确存储分配有'new'的对象......它们在应用程序完成时被管理和销毁......不早!我可以验证该对象没有被破坏,因为我有多个指向同一个 PIXEL 对象的指针......一个很好,但数组中的指针变得无效......
【参考方案1】:
如果您确定向量中的实际指针值已更改(ie 您已通过在之前和之后将指针值输出到控制台或文件来验证这一点),那么有些东西是垃圾你的向量。否则,您可能已经释放了该内存。
如果指针值发生了变化,一些常见的情况是:
缓冲区溢出(或类似的未定义行为)已覆盖部分或全部矢量数据;
缓冲区溢出(或类似的未定义行为)覆盖了向量本身,或者向量是已销毁对象的一部分;
多线程环境中的竞争条件 - 您可能需要锁定以确保对向量的原子访问;
您的程序中的逻辑错误在对向量进行操作时弄乱了向量;
你做了一些令人讨厌的事情并破坏了堆。
如果指针值没有改变,那么一些常见的场景是:
您已经将 PIXEL
对象返回到操作系统的某个位置(可能在析构函数中删除);
PIXEL
对象已在堆栈上定义并已被销毁(即存储指向临时对象的指针);
你做了一些令人讨厌的事情并破坏了堆。
【讨论】:
我肯定没有释放内存...我可以使用存储在不同位置(数组或向量)的指针访问 PIXEL 对象... 这是我正在寻找的答案,只是关于为什么会出现此问题的一般信息...我将进一步调试并尝试揭露问题...以上是关于C++ 中的指针错误的主要内容,如果未能解决你的问题,请参考以下文章
当指向删除和指向不同的对象时,C++ 中的 Seg 错误指针
如何解决 munmap_chunk():C++ 中的无效指针错误