2012-02-23 87 views
1

我的程序崩溃,指针无效。当我用它运行gdb时,它告诉我导致崩溃的无效指针的地址。它崩溃上线是一个删除指针崩溃无效,但指针不同

delete some_pointer; 

但是,当我用鼠标右键删除之前打印出来的指针,作为一个GDB告诉我是无效的地址是不一样的。那么,当它崩溃而不是导致问题的指针时,我正在删除some_pointer? GDB说 -

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

那么,为什么它的每一次崩溃上自由使用不同的地址?我只想确保我在这里正确思考。

+4

为什么在使用'delete'时标记'C'? – cnicutar 2012-02-23 18:58:22

+1

'some_pointer'的类型是什么? – 2012-02-23 18:58:40

+0

地址在每次运行中都会有所不同。所有地址都是。 – pmr 2012-02-23 18:58:53

回答

0

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

+1

但即使我删除了两次,它不应该仍然有相同的地址? – Sterling 2012-02-23 19:16:31

+0

@Sterling:我不会把太多的重量放在实际的指针值上。首先,它看起来像指针变量的地址 - 不是指针值(内容)。其次,第一次删除是成功的,所以你可能不知道当时的价值。第三,可能已经分配了另一个指针值;没有看到一些代码,这一定是假设性的猜测。第四,指针值可能因运行而异,原因很多:随机性(无论是有意的还是对环境的反应)或SELinux原因(随机化内存布局)。 – wallyk 2012-02-23 19:23:11

0

如果你有这样的事情:

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

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

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

0

如果您有一个具有多重继承的类,地址将根据指针的类型进行调整。 free将需要使用基本类型,但编译器应该能够在场景后方无形地进行适当的转换。