gpt4 book ai didi

c++ - 内存访问冲突 C++ Borland

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:00:41 27 4
gpt4 key购买 nike

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 变量是“???? “?

注册 *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

关于c++ - 内存访问冲突 C++ Borland,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7879274/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com