Нарушение доступа к памяти C ++ Borland - PullRequest
2 голосов
/ 24 октября 2011
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 голосов
/ 24 октября 2011

Код компилируется и выполняется правильно, так что, скорее всего, именно так, как вы создаете экземпляр переменной PReg. Я сделал это двумя способами, во-первых, я предполагаю, что вы делаете это:

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

А также просто объявив это:

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

И оба выведите «0», как и ожидалось. Если бы вы могли опубликовать, как вы создаете экземпляр PReg, это было бы полезно.

0 голосов
/ 24 октября 2011

Вот почему (насколько я могу судить, учитывая то, что вы отправили)

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.

...