读取访问冲突。这是0xCDCDCDCDCD

时间:2018-10-04 03:47:06

标签: c++ access-violation this-pointer

我对我做错了什么感到困惑?调试时,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 :(得分:1)

您在混合使用CLASSClassInsurance的地方使用一个名称,这样您发布的代码将无法编译。我将其替换为IronMan

您看到的0xCDCDCDCD不是this指针值,而是指针成员theDouble的值。问题来自构造函数:

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

该构造函数取消引用未初始化的成员变量theDouble并 由于调试器倾向于使用诸如0xCD之类的一些字节填充未初始化的内存,因此您会将其作为指针的值。因此,访问该地址的内存会崩溃。

一种解决方法是为theDouble分配内存

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

更好的选择是完全避免使用指针,而只具有直接的double数据成员:

protected:
    double theDouble;