C ++:这个指针被覆盖了

时间:2010-12-11 13:57:43

标签: c++ pointers segmentation-fault x11

请查看我的源文件,它们有点太长了,无法在此处发布:

X11Painter.cpp: http://pastebin.com/gu4SrHUr

X11Painter.h: http://pastebin.com/3ktp1Fvn

这个课程的行为在我看来是非常奇怪

我有以下测试用例:

#include "X11Painter.h"
int main()
{
    X11Painter p ;
    p.show();
}

用行

编译它
g++ -O0 -g -o test2 test2.cpp X11Painter.cpp -lX11 -lXfixes -lXinerama

只需运行它就可以执行以下操作:

this->some_test=1234
this->screen:0
1:: this->display='0x8b73008'; this->window='77594625'
width: 3200
0xbff91bdc
this->some_test=1234
this->some_test=3682292
Segmentation fault

我正在尝试在X11Painter::show()

中映射X11窗口

当我开始研究为什么X11Painter.cpp:83是segfaulting时,我发现大多数变量在show()中被覆盖并且完全不同于构造函数中的变量。

我把int some_test看看发生了什么。为什么地狱的价值会发生变化?

如果我printf("%p\n", this),指针也会改变。我怀疑在某个地方,这个指针被覆盖了。但为什么会这样呢?使用ddd进行调试告诉我,在退出构造函数的同时修改了this-> some_value。

使用testclass(带有公共构造函数的类,一个公共方法和一个私有变量)进行简短测试,没有任何问题。

有没有人知道为什么会发生这种奇怪的事情? 我知道堆栈上的变量会发生什么变化,但我们仍然在那里......

它可能与X11库相关吗?

2 个答案:

答案 0 :(得分:12)

在无参数构造函数中,执行此操作

X11Painter::X11Painter()
{
    X11Painter(-1);
}

这不是你认为它正在做的事情,因为在C ++中没有构造函数链接。上面的代码正在构建一个临时的X11Painter对象,调用该临时对象的另一个构造函数,但实际上并没有初始化你想要构造的对象中的任何东西。

要修复此问题但保留相同的行为,请删除无参数构造函数,并在.h文件中将其他构造函数声明为

X11Painter(int screenno = -1);

如果您不提供screenno参数,则默认-1参数。

答案 1 :(得分:1)

这看起来像堆栈损坏,很可能是通过

产生的
        Window                  window;
        XSetWindowAttributes    winattr;

成员,因为其他人都是原始类型。例如,我注意到了这一点:

    XStoreName(this->display, this->window, "LaserFinger");

如果窗口和显示器没有正确的内存量,可以使用kaboom。 但是,如果不了解X11库,我就无法提供更多帮助。