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++ 中的无效指针错误

C++ 指针问题:如何修复这些代码中的错误? [关闭]

C++中char指针中的memset的分段错误(核心转储)[重复]

使用指向指针 C++ 的指针时出现分段错误

没有指针的 C++ 分段错误 (HackerRank)