Atm*_*ons 2 c++ x11 pointers segmentation-fault
请看一下我的源文件,它们有点太长了,不能在这里发布:
X11Painter.cpp: http://pastebin.com/gu4SrHUr
X11Painter.h: http://pastebin.com/3ktp1Fvn
在我看来,这堂课的行为很奇怪.
我有以下测试用例:
#include "X11Painter.h"
int main()
{
X11Painter p ;
p.show();
}
Run Code Online (Sandbox Code Playgroud)
用线编译它
g++ -O0 -g -o test2 test2.cpp X11Painter.cpp -lX11 -lXfixes -lXinerama
Run Code Online (Sandbox Code Playgroud)
只需运行它就可以执行以下操作:
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
Run Code Online (Sandbox Code Playgroud)
我正在尝试映射X11窗口 X11Painter::show()
当我开始调查为什么X11Painter.cpp:83是segfaulting时,我发现大多数变量都被覆盖并且show()
与构造函数中的变量完全不同.
我把它int some_test
看看发生了什么.为什么地狱的价值会发生变化?
如果我这样做printf("%p\n", this)
,指针也会改变.我怀疑在某个地方,这个指针被覆盖了.但为什么会这样呢?用ddd调试告诉我,在退出构造函数的同时修改了this-> some_value.
使用测试类(具有公共构造函数的类,一个公共方法和一个私有变量)进行简短测试可以正常工作.
有没有人知道为什么会发生这种奇怪的事情?我知道堆栈中的变量会发生什么变化,但我们仍然在那里...
可能与X11库有关吗?
Jaa*_*koK 12
在无参数构造函数中,您可以执行此操作
X11Painter::X11Painter()
{
X11Painter(-1);
}
Run Code Online (Sandbox Code Playgroud)
这不是你认为它正在做的事情,因为在C++中没有构造函数链接.上面的代码正在做的是构造一个临时X11Painter
对象,为该临时对象调用另一个构造函数,但实际上并没有初始化你想要构造的对象中的任何东西.
要修复此问题但保留相同的行为,请删除无参数构造函数,并在.h
文件中将其他构造函数声明为
X11Painter(int screenno = -1);
Run Code Online (Sandbox Code Playgroud)
如果您不提供screenno
参数,这将默认参数-1
.