请查看我的源文件,它们太长了,无法在此处发布: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出现段错误时,我发现
show()
中的大多数变量都被覆盖,并且与构造函数中的变量完全不同。我输入了
int some_test
来查看发生了什么。为何值(value)不断变化?如果我执行
printf("%p\n", this)
,指针也会更改。我怀疑该指针在某处被覆盖。但是为什么会这样呢?用ddd调试告诉我,退出构造函数时,this-> some_value已被修改。使用testclass(具有公共(public)构造函数,一个公共(public)方法和一个私有(private)变量的类)进行简短测试可以正常工作。
有人知道为什么发生这种奇怪的事情吗?
我知道堆栈上的变量会发生什么,但是我们仍然在那里。
可能与X11库有关吗?
最佳答案
在无参数构造函数中,您可以执行此操作
X11Painter::X11Painter()
{
X11Painter(-1);
}
由于C++中没有构造函数链接,因此这并没有按照您的想法进行。上面的代码正在做的是构造一个临时的
X11Painter
对象,调用该临时对象的另一个构造函数,但实际上并未初始化要构造的对象中的任何内容。要解决此问题,但保留相同的行为,请删除无参数构造函数,并在
.h
文件中将另一个构造函数声明为X11Painter(int screenno = -1);
如果不提供,则将
screenno
参数默认为-1
。