class Register
{
private:
DWORD ax,dx,cx,bx; // POH
DWORD bp,sp;
DWORD flag, ip;
public:
//====================================================
Register()
{
ax = 0x0;
dx = 0x0;
cx = 0x0;
bx = 0x0;
bp = 0x0;
memset(&this->sp,0,sizeof(sp));
sp = 0x0;
flag = 0x0;
ip = 0x0;
}
//====================================================
~Register()
{
}
//====================================================
void setAx(DWORD d)
{
ax=d;
}
//====================================================
void setDx(DWORD d)
{
dx=d;
}
//====================================================
void setCx(DWORD d)
{
cx=d;
}
//====================================================
void setBx(DWORD d)
{
bx=d;
}
//====================================================
void setBp(DWORD d)
{
bp=d;
}
//====================================================
void incSp()
{
sp = sp+1;
}
void decSp()
{
if(sp == 0)
{
sp = 0;
}
sp = sp - 1;
}
//====================================================
void setFlag(DWORD d)
{
flag=d;
}
//====================================================
void setIp(DWORD d)
{
ip=d;
}
//====================================================
DWORD getAx()
{
return ax;
}
//====================================================
DWORD getDx()
{
return dx;
}
//====================================================
DWORD getCx()
{
return cx;
}
//====================================================
DWORD getBx()
{
return bx;
}
//====================================================
DWORD getBp()
{
return bp;
}
//====================================================
DWORD getSp()
{
return this->sp;
}
//====================================================
DWORD getFlag()
{
return flag;
}
//====================================================
DWORD getIp()
{
return ip;
}
//====================================================
};
为什么当我使用getSp();像这样的功能:
PReg->getSp();
它给了我一个AV错误,我在初始化该点时跟踪了该变量,并给了我一个设置为零的随机数,将其设置为零,在问题函数处,sp变量为“????” ?
Register *PReg;
-PReg :) 最佳答案
这就是为什么(据我所知您所发布的内容)
Register *PReg;
PReg
无效。当然,您声明了它,但从未对其进行初始化,因此它的值是不确定的,取消引用它会导致未定义的行为。您需要对其进行new
编码或使用其他地方的有效指针对其进行初始化。简单声明它不会分配内存并初始化指针。对于没有静态存储空间的任何变量也是如此,但是即使它是静态的,指针也将仍然无效,除非在取消引用之前将其初始化。Register *PReg = new Register();
// use it...
delete PReg;
坦白说,除非您知道自己在做什么,否则不应在C++中以这种方式设计代码。查看RAII。就您的示例而言,我认为没有理由不仅仅使用自动存储。
void Foo() {
Register reg;
// use reg
} // reg goes out of scope, memory reclaimed
另外,我也不知道为什么要使用
memset
初始化sp
。