Прочитав другие вопросы о стеке, я знаю, что эта ошибка означает, что я пытаюсь разыменовать нулевой указатель. Однако я не могу понять, где мой код разыменовывает нулевой указатель. Я пытаюсь установить для char* (cstring) ненулевое значение, но получаю сообщение об ошибке нарушения прав доступа. Вот код:
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. Ради бога, пожалуйста, не говорите мне, что я не должен использовать cstrings! Я знаю, что std::string лучше, но это домашнее задание, требующее cstrings.
if (this->name)
В этом нет необходимости. Нет необходимости проверять наличие nullptr или NULL при вызовеdelete[]
. Кроме того, что, если я передам нулевой указатель наsetName
? Ваша программа будет иметь неопределенное поведение, так как strlen(0) является UB. - person PaulMcKenzie   schedule 09.06.2014std::string
, вы будете использоватьstd::string
. Не забывайте постоянно поддерживать зрительный контакт. - person Shoe   schedule 09.06.2014