首页 > 解决方案 > 读取访问冲突。这是 0xCDCDCDCD

问题描述

我对自己做错了什么感到困惑?在调试时,this显示0xcdcdcdcd {theDouble=??? }所以我知道我的变量没有存储在我的 mutator 中。我将如何解决这个问题?我应该在this某个地方初始化吗?顺便说一句,我正在使用视觉工作室。感谢您的帮助。

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();
   };`

标签: c++access-violationthis-pointer

解决方案


您使用CLASS,ClassInsurance在您应该使用一个名称的地方混合使用,这样您发布的代码就无法编译。我用IronMan.

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

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

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

一种解决方法是为theDouble

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

最好完全避免在那里使用指针,而只使用直接的双数据成员:

protected:
    double theDouble;

推荐阅读