C++ &引用;这";按词汇顺序最后而不是第一次推送指针

C++ &引用;这";按词汇顺序最后而不是第一次推送指针,c++,c++11,mingw,this,mingw32,C++,C++11,Mingw,This,Mingw32,我在为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.cp

我在为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
,但是值得注意的是
隐式参数设置为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);
    }
  }
}
map::map(loc dim,uint8 fill):\u dim(dim),tcodmap(\u dim.x,\u dim.y),actors()
{
_尺寸=_dim.x*_dim.y;
_数据=新的uint8[_大小];
(int席席=0;席< xΩx;XI++)
{
for(int yi=0;yi<_dim.y;yi++)
{
放(xi,yi,fill);
}
}
}
似乎没有正确遵守
thiscall
调用约定,即
this
指针应该最后推到堆栈上,以使其在参数列表中处于词汇上的第一位


如何修复此问题?

我编写了一个测试程序来检查您试图执行的操作。首先,您在运行时得到错误,而不是在编译时,因为您提供了gdb的堆栈跟踪

#include <iostream>

struct Data{
  int _x;
  int _y;
};

class A{

  public:
    A(){}
    A(int x){}
    A(const A&,int y){}
    A(int x , int y)
    {

    }

};

class B{
  Data _d;
  A _a;
  public:

  B(Data d,int fill):_d(d),_a(_d._x,_d._y)
  {

  }

};

int main()
{
  Data d;
  d._x=1;
  d._y=2;

  B instance(d,4);

  return 0;
}
这里的要点是,“this”隐式指针将指向一个有效地址,除非您的程序导致“堆栈缓冲区溢出”,这会破坏分配给tcodmap的“this”指针的内存

您应该分享完整代码的更多细节,以及如何使用此程序。
你每次跑步都会遇到这个问题吗?还是随机的?

电脑很听话!是否确实没有将过时对象文件链接到项目中?没有过时对象。我已经多次重新编译了所有代码,但得到了相同的一致结果。每次运行都一致地使用代码中任何位置的相同构造函数,每次运行的值都相同,具体取决于调用的位置。我完全重新构建了代码,以确保没有过时的对象。请尝试将内存分配给堆上的tcdomp,并使用新运算符(将tcodmap更改为指针类型)。您可以这样做并查看行为吗?使用“new”和存储指针时的行为是相同的。它发生在调用构造函数时。我怀疑问题在于库二进制文件。我将看看是否可以从源代码中重建库,尽管到目前为止它只给我提供了windows标头错误。
> Breakpoint 1, B::B (this=0x7fffffffe1a0, d=..., fill=4) at this.cpp:26
> 26      B(Data d,int fill):_d(d),_a(_d._x,_d._y) (gdb) s A::A
> (this=0x7fffffffe1a8, x=1, y=2) at this.cpp:17 17     } (gdb) bt
> #0  A::A (this=0x7fffffffe1a8, x=1, y=2) at this.cpp:17
> #1  0x00000000004006fb in B::B (this=0x7fffffffe1a0, d=..., fill=4)
>     at this.cpp:26
> #2  0x0000000000400652 in main () at this.cpp:39