请查看我的源文件,它们有点太长了,无法在此处发布:
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()
当我开始研究为什么X11Painter.cpp:83是segfaulting时,我发现大多数变量在show()
中被覆盖并且完全不同于构造函数中的变量。
我把int some_test
看看发生了什么。为什么地狱的价值会发生变化?
如果我printf("%p\n", this)
,指针也会改变。我怀疑在某个地方,这个指针被覆盖了。但为什么会这样呢?使用ddd进行调试告诉我,在退出构造函数的同时修改了this-> some_value。
使用testclass(带有公共构造函数的类,一个公共方法和一个私有变量)进行简短测试,没有任何问题。
有没有人知道为什么会发生这种奇怪的事情? 我知道堆栈上的变量会发生什么变化,但我们仍然在那里......
它可能与X11库相关吗?
答案 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库,我就无法提供更多帮助。