【问题标题】:Investigating why a pointer turns bad (C++)调查指针变坏的原因 (C++)
【发布时间】:2012-02-24 00:31:47
【问题描述】:

我在 VS 2008 中查看的一段 C++ 代码有一个错误的指针。指针已正确初始化,并且引用它的代码行很少。我在调试时监视了这个指针。

调用某个方法时,指针的值突然从 0x05fe0040 "" 变为0x00000000 Bad Ptr (在VS2008的Watch窗口中)。我无法弄清楚为什么会这样。在指针丢失值的代码行之间没有对指针进行任何操作。

我该如何进一步调查?这个指针变坏的可能原因有哪些?

我是 C++ 编程新手,并且是第一次使用 VS2008,所以请解释一下您认为相关的任何内容。

【问题讨论】:

  • 发布代码,即使您认为它是正确的。
  • 您可能正在覆盖堆栈的一部分。或者您的指针可能超出范围。邮政编码更多...
  • 也许如果你能分享一些我们能够帮助的代码......
  • 您可以使用 gdb 调试内存区域的观察点。因此,您可以看到它在哪里被破坏以及被哪个变量破坏。
  • 函数调用里面的指针的值,外面呢?可能是如果您将指针放在监视列表中并进入函数,那么由于指针不再在范围内,监视窗口无法对其进行评估。确实有很多可能性,代码示例加上对您正在做什么的更准确的描述会有所帮助。

标签: c++ visual-studio-2008 pointers visual-studio-debugging watch


【解决方案1】:

如果操作变量的任何代码未更改该值,则必须通过stray/dangled pointerbuffer/array overflow 访问它。

Use a memory breakpoint 在指针变量上,这样调试器将快速显示哪些代码正在破坏它。

【讨论】:

  • 我使用了你上面提到的内存断点。事实证明,一个单独的进程正在调用析构函数来释放分配给指针的内存。非常感谢,这是一个非常简洁的功能!
【解决方案2】:

您可能在其他地方访问了数组索引或一些无效内存(例如未初始化的指针)并覆盖了指针变量的值。

【讨论】:

    猜你喜欢
    • 2011-01-13
    • 1970-01-01
    • 2016-09-16
    • 2018-06-29
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    相关资源
    最近更新 更多