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

09-04 02:20