内存访问违规C ++ Borland

时间:2011-10-24 17:15:03

标签: c++ c++builder access-violation

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:)

2 个答案:

答案 0 :(得分:0)

这就是为什么(根据你发布的内容,我可以告诉你)

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

答案 1 :(得分:0)

代码编译并正确运行,因此很可能是您实例化PReg变量的方式。我已经完成了两种方式,第一种是我假设你正在这样做的方式:

Register *PReg = new Register;
cout << PReg->getSp() << endl;

还要宣布:

Register PReg;
cout << PReg.getSp() << endl;

两者都按预期打印“0”。如果您可以发布如何创建PReg实例,那将会有所帮助。