【发布时间】:2013-12-04 03:50:19
【问题描述】:
我在为 mingw32 编译一些代码时遇到问题,链接一个 mingw32 编译的库。当我在动态链接的库中调用类的成员函数(即构造函数)时,参数会以错误的顺序推送到堆栈中。
这是一个例子:
Program received signal SIGSEGV, Segmentation fault.
0x65e717e9 in TCODMap::TCODMap (this=0x40, width=48, height=40)
at src/fov.cpp:28
28 src/fov.cpp: No such file or directory.
(gdb) backtrace
#0 0x65e717e9 in TCODMap::TCODMap (this=0x40, width=48, height=40)
at src/fov.cpp:28
#1 0x00401bda in map::map (this=0x8683c8, dim=..., fill=0 '\000')
at src/map.cpp:12
#2 0x004017d7 in next_init () at src/main.cpp:24
#3 0x00401b8e in main (argc=1, argv=0x862fc8) at src/main.cpp:98
我对 TCODMap 构造函数的调用有参数 width=64 和 height=48,但值得注意的是,this 隐式参数设置为 64 (0x40),width 设置为 48,height设置为某个垃圾值 40。在这种情况下,构造函数被调用为我在用户代码中拥有的另一个类的初始化程序的一部分。
有问题的代码:
map::map(loc dim, uint8 fill) : _dim(dim), tcodmap(_dim.x, _dim.y), actors()
{
_size = _dim.x * _dim.y;
_data = new uint8[_size];
for (int xi = 0; xi < _dim.x; xi++)
{
for (int yi = 0; yi < _dim.y; yi++)
{
put(xi, yi, fill);
}
}
}
似乎 thiscall 调用约定,即 this 指针应最后压入堆栈,使其在参数列表中的词法上排在第一位,但没有得到正确遵守。
我该如何解决这个问题?
【问题讨论】:
-
电脑很听话!
-
您确定您的项目中没有链接过时的对象文件吗?
-
没有过时的对象。我已经多次重新编译了所有代码,但得到了相同的一致结果。
标签: c++ c++11 mingw this mingw32