从阅读其他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的家庭作业。
答案 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_;
};