Нарушение прав чтения. это было 0xCDCDCDCD
Я не понимаю, что я делаю не так? Во время отладки, 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 ответ
Ты используешь 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;