нарушение доступа для чтения.это было 0xCDCDCDCD - PullRequest
0 голосов
/ 04 октября 2018

Я не понимаю, что я делаю не так?Во время отладки this показывает 0xcdcdcdcd {theDouble=??? }, поэтому я знаю, что моя переменная не сохраняется в моем мутаторе.Как мне решить проблему?Я должен инициализировать this где-нибудь?Кстати, я использую Visual Studio.Спасибо за помощь.

int main()
{
    int i = 0;
    const int MAX = 4;
    CLASS **object = new CLASS*[MAX];
    string name = "todd";
    string aString = "words";
    double aDouble = 10.0;
    object[i]->setDouble(aDouble);
    return 0;
}

//.cpp
CLASS::Class()
{
    theDouble = new double;
    *theDouble = NULL;
}
CLASS::Class(double aDouble)
{
    *theDouble = aDouble;
}
void CLASS::setDouble(double p)
{
    *theDouble = p; 
double Class::getDouble()
{return (*theDouble);}

//.h
class CLASS
{
 protected:
    double *theDouble;
 public:
    Insurance();
    Insurance(double premium);
    //~Insurance();
    void setDouble(double p);
    double getDouble();
    string toString();
   };`

1 Ответ

0 голосов
/ 04 октября 2018

Вы используете CLASS, Class и Insurance в смеси, где вы должны использовать одно имя, чтобы ваш опубликованный код не мог скомпилироваться.Я заменяю их на IronMan.

То, что вы видите как 0xCDCDCDCD, это не this значение указателя, а значение члена указателя theDouble.Проблема возникает в конструкторе:

IronMan::IronMan(double aDouble)
{
    *theDouble = aDouble;
}

Этот конструктор разыменовывает неинициализированную переменную-член theDouble, и поскольку отладчики имеют тенденцию заполнять неинициализированную память некоторыми байтами, такими как 0xCD, вы будете иметь это значение указателя.Поэтому вы получаете сбой при доступе к памяти по такому адресу.

Один из способов - выделить память для theDouble

IronMan::IronMan(double aDouble)
{
    theDouble = new double(aDouble);   
}

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

protected:
    double theDouble;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...