【问题标题】:Invalid pointer crash on delete, but different pointer删除时无效指针崩溃,但指针不同
【发布时间】:2012-02-23 18:56:55
【问题描述】:

我的程序因指针无效而崩溃。当我用它运行 gdb 时,它会告诉我导致崩溃的无效指针的地址。它崩溃的行是

delete some_pointer;

但是当我在删除指针之前打印出指针时,地址与gdb告诉我的那个地址不一样是无效的。那么我在崩溃时删除的 some_pointer 不是导致问题的指针吗? gdb 说 -

free(): invalid pointer: 0xbfffea84 ***

那么为什么每次使用不同的地址时它都会崩溃呢?我只是想确保我在这里的想法是正确的。

【问题讨论】:

  • 为什么在使用delete的时候标记C
  • some_pointer的类型是什么?
  • 每次运行的地址都会不同。所有地址都是。
  • 可能希望显示一些其他代码,例如some_pointer 的声明和分配,以使这一点更清楚。例如,如果您的指针未初始化,您可能会遇到类似这样的情况...
  • 我们需要更多的代码,我认为从 gdb 中分离出来的推理是不重要的。你很可能有逻辑/实现错误。

标签: c++ pointers crash gdb free


【解决方案1】:

几乎可以肯定,在您正在查看的删除之前,指针是deleted。两次删除指针会导致所描述的症状。

【讨论】:

  • 但是就算我删了两次,不应该还是一样的地址吗?
  • @Sterling:我不会对实际的指针值施加太多的权重。首先,这看起来像是指针变量的地址,而不是指针值(内容)。其次,第一次删除是成功的,所以你可能不知道当时的值是多少。第三,可以分配另一个指针值;没有看到一些代码,这必然是假设性的猜测。第四,由于许多原因,指针值可能因运行而异:随机性(无论是有意还是对环境的反应)或 SELinux 原因(随机化内存布局)。
【解决方案2】:

如果你有这样的事情:

struct S
{
   int* p;
   ~S() { delete p;}
};

S* s;
std::cout << (void*)s;
delete s;

可能你的程序在删除p时会崩溃,但是s会被打印出来。它们可能会有所不同。

【讨论】:

    【解决方案3】:

    如果你有一个多继承的类,地址会根据指针的类型进行调整。 free 将需要使用基类型,但编译器应该能够在幕后无形地进行正确的转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-13
      • 2016-03-11
      • 2014-07-16
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      相关资源
      最近更新 更多