C++ 删除时无效的指针崩溃,但指针不同

C++ 删除时无效的指针崩溃,但指针不同,c++,pointers,crash,gdb,free,C++,Pointers,Crash,Gdb,Free,我的程序因指针无效而崩溃。当我用它运行gdb时,它会告诉我导致崩溃的无效指针的地址。它撞坏的线路是一个 delete some_pointer; 但是,当我在删除指针之前打印出指针时,地址与gdb告诉我的无效地址不同。那么,当某个指针崩溃时我正在删除它,而不是导致问题的指针吗?gdb说- free(): invalid pointer: 0xbfffea84 *** 那么为什么它每次都会在一个地址不同的免费服务器上崩溃呢?我只是想确保我在这里的想法是正确的。如果你有这样的想法: struct

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

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

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

那么为什么它每次都会在一个地址不同的免费服务器上崩溃呢?我只是想确保我在这里的想法是正确的。

如果你有这样的想法:

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

S* s;
std::cout << (void*)s;
delete s;
结构
{
int*p;
~S(){delete p;}
};
S*S;

如果您有一个具有多重继承的类,那么地址将根据指针的类型进行调整
free
将需要使用基类型,但编译器应该能够在幕后进行不可见的正确转换。

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

为什么在使用
delete
时要标记
C
?某些指针的类型是什么?每次运行时地址都会不同。所有地址都是。可能需要显示一些其他代码,如
some\u指针的声明和分配
,以使其更清楚。例如,如果您的指针未初始化,您可能会遇到这样的情况……我们需要更多的代码,我认为从gdb中分离出来的推理是多余的。您很可能存在逻辑/实现错误。但即使我删除了两次,它是否仍应具有相同的地址?@Sterling:我不会对实际指针值太过重视。首先,这看起来像指针变量的地址,而不是指针值(内容)。第二,第一次删除成功,因此您可能不知道当时的值是多少。第三,可以指定另一个指针值;没有看到一些代码,这必然是假设性的推测。第四,指针值可能因多种原因在不同的运行中有所不同:随机性(无论是有意的还是对环境的反应)或SELinux原因(使内存布局随机化)。