访问冲突读取位置0x00000000 cstrings

时间:2014-06-08 22:57:44

标签: c++ access-violation cstring

从阅读其他stackoverflow问题我知道这个错误意味着我试图取消引用空指针。但是,我无法弄清楚我的代码在哪里取消引用空指针。我试图将char *(cstring)设置为非null值,但是我收到了访问冲突错误。这是代码:

void Data::setName(char const * const name)
{
    if (this->name)
        delete[] this->name;

    this->name = new char[strlen(name) + 1];    // This is where my code breaks in debug mode
    strcpy(this->name, name);
}

name是一个char *变量,它被初始化为null。 setName由重载的赋值运算符调用:

Data& Data::operator=(const Data& data2)
{
    //if it is a self copy, don't do anything
    if (this == &data2)
        return *this;

    else
    {
        setName(data2.name);    // Here is the call to setName
        return *this;
    }
}

P.S。为了上帝的爱,请不要告诉我我不应该使用弦乐!我知道std :: string更好,但这是一个需要cstrings的家庭作业。

1 个答案:

答案 0 :(得分:2)

如果这是代码中断的行:

this->name = new char[strlen(name) + 1];

然后name必须是空指针,因为没有其他任何内容被取消引用name函数内部strlen被取消引用。只需在调试器中打印变量值,您就可以确定。


此外,在setter中使用相同的变量名称,如下所示:

struct A
{
    void set(int a){this->a = a;}
    int a;
};

不是一个好习惯。只需使用:

struct A
{
    void set(int na){a = na;}
    int a;
};

struct A
{
    void set(int a){a_ = a;}
    int a_;
};