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

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.

  • 用于指出错误的+1,但有两个注释:1.在下一个C++版本中,将有构造函数链接,尽管语法不同.2.构造函数应该声明为`explicit`,因为从`int`到`X11Painter`的隐式转换是没有意义的. (4认同)