内存访问违规C++ Borland

内存访问违规C++ Borland,c++,c++builder,access-violation,C++,C++builder,Access Violation,为什么我使用getSp;功能如下: class Register { private: DWORD ax,dx,cx,bx; // POH DWORD bp,sp; DWORD flag, ip; public: //==================================================== Register() { ax = 0x0;

为什么我使用getSp;功能如下:

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;
        }
        //====================================================
};
它给了我一个AV错误,我在初始化时跟踪了这个变量,它给了我一个随机数,而不是零,我设置为,在问题函数点,sp变量是


寄存器*PReg;-PReg:

这就是为什么就我所知,考虑到你发布的内容

PReg->getSp();
PReg无效。当然,您声明了它,但从未初始化它,因此它的值是不确定的,取消引用它会导致未定义的行为。您需要新建它或使用其他地方的有效指针初始化它。简单地声明它不会分配内存并初始化指针。这同样适用于没有静态存储空间的任何变量,但即使它是静态的,指针仍然无效,除非它在解引用之前在某个地方初始化

Register *PReg;
但是,你不应该用C++的方式来设计你的代码,除非你知道你在做什么。调查至于你的例子,我看没有理由不使用自动存储

Register *PReg = new Register();
// use it...
delete PReg;

另外,我不知道您为什么要使用memset来初始化sp。

这就是为什么根据您发布的内容,我可以告诉您这一点

PReg->getSp();
PReg无效。当然,您声明了它,但从未初始化它,因此它的值是不确定的,取消引用它会导致未定义的行为。您需要新建它或使用其他地方的有效指针初始化它。简单地声明它不会分配内存并初始化指针。这同样适用于没有静态存储空间的任何变量,但即使它是静态的,指针仍然无效,除非它在解引用之前在某个地方初始化

Register *PReg;
但是,你不应该用C++的方式来设计你的代码,除非你知道你在做什么。调查至于你的例子,我看没有理由不使用自动存储

Register *PReg = new Register();
// use it...
delete PReg;

另外,我不知道为什么要使用memset来初始化sp。

代码编译和运行正确,因此很可能是您实例化PReg变量的方式。我有两种方法,第一种是我假设你在做的方式:

void Foo() {
    Register reg;
    // use reg
}  // reg goes out of scope, memory reclaimed
也只是宣布:

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

并按预期打印0。如果您可以发布如何创建PReg实例,这将非常有用。

代码编译和运行正确,因此很可能是以您实例化PReg变量的方式进行的。我有两种方法,第一种是我假设你在做的方式:

void Foo() {
    Register reg;
    // use reg
}  // reg goes out of scope, memory reclaimed
也只是宣布:

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


并按预期打印0。如果您可以发布如何创建PReg实例,这将非常有用。

为什么您对SP的处理与其他实例不同?你是如何分配你的PReg的?你能告诉我们声明PReg的代码吗?你是如何声明你的Register实例的?没有人能帮我吗?你真的给你的Register PReg指针赋值了吗?如果您不这样做,那么它就是垃圾,可能会导致访问冲突。为什么您对SP的处理与其他SP不同?你是如何分配你的PReg的?你能告诉我们声明PReg的代码吗?你是如何声明你的Register实例的?没有人能帮我吗?你真的给你的Register PReg指针赋值了吗?若你们并没有,那个么它就是垃圾,可能会导致访问冲突;这里还有一点:类堆栈{private:DWORD堆栈[Stack_SIZE];DWORD stack_max;Register*PReg;public:…这告诉我如何声明指针,而不是如何创建类的实例。如果您试图在堆栈内部使用PReg,而不在任何地方调用PReg=new Register,那么每次都会崩溃,因为您试图引用一个统一化的指针。Ive已经发布了我是如何创建PReg实例的;这里还有一点:类堆栈{private:dwordstack[Stack_SIZE];DWORD stack_max;Register*PReg;public:…这告诉我如何声明指针,而不是如何创建类的实例。如果您试图在堆栈内部使用PReg,而不在任何地方调用PReg=new Register,那么它每次都会崩溃,因为您试图引用一个统一化的指针。Th谢谢你!你帮了我很多!我使用Register*PReg,因为我只需要一个寄存器实例。而memset用于初始化sp,正如其他人所说。初始化sp不需要memset,只需指定一个值。memset非常适合快速分配相对较大的数据块。大多数循环数组初始化都将转换为s编译器只需调用一个memset,但这里不需要。再次感谢你,现在我会更加小心!谢谢你!你帮了我很多忙!我使用Register*PReg,因为我只需要一个寄存器实例。而memset用于初始化sp,正如其他人所说的那样..是吗
不需要memset来初始化它;只需指定一个值。memset非常适合快速分配相对较大的数据块。大多数循环数组初始化将由编译器转换为对memset的单个调用,但这里不需要它。再次感谢您,现在我会更加小心!