【问题标题】:Memory Access violation C++ Borland内存访问冲突 C++ Borland
【发布时间】:2011-10-24 17:15:03
【问题描述】:
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 :)

【问题讨论】:

  • 为什么你对待 SP 的方式与其他的不同?你如何分配你的PReg
  • 你能告诉我们声明PReg的代码吗?
  • 如何声明Register 的实例?
  • 没人能帮我吗?
  • 您是否真的为指向寄存器PReg 的指针赋值?如果不是,那么它就是垃圾,可能会导致访问冲突。

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


【解决方案1】:

这就是原因(据我所知,鉴于您发布的内容)

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

【讨论】:

  • 谢谢!你帮了我很多!我使用 Register *PReg 因为我只需要一个 Register 实例。和 memset 来初始化我使用的 sp,就像其他人所说的那样..
  • 你不需要 memset 来初始化它;只需分配一个值。 memset 非常适合快速分配相对较大的数据块(大多数循环数组初始化将被编译器转换为对 memset 的单个调用),但这里不需要。
  • 再次感谢您,现在请多加小心!
【解决方案2】:

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

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

也只是声明它:

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

并且都按预期打印“0”。如果您可以发布您是如何创建 PReg 实例的,那将会很有帮助。

【讨论】:

  • 我已经发布了我如何创建 PReg 的实例;这里还有一点:class Stack { private: DWORD stack[STACK_SIZE]; DWORD stack_max; Register *PReg; public: ...
  • 这告诉我你如何声明指针,而不是你如何创建类的实例。如果你试图在 Stack 中使用 PReg 而没有在任何地方调用“PReg = new Register”,那么每次都会崩溃,因为你试图引用一个未初始化的指针。
猜你喜欢
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 2013-05-12
  • 2021-06-15
  • 1970-01-01
  • 2017-01-08
相关资源
最近更新 更多