2014-12-09 4 views
0

Я работаю над BST для класса. В классе есть 5 файлов, 2 1/2 из которых я не могу редактировать (как упражнение в ООП). Я не могу редактировать data.h, driver.cpp или публичные члены bst.cpp.Ошибки исключения при использовании strcpy

У меня возникают ошибки при попытке использования strcpy в файле data.cpp. Это актуально, потому что моя функция вставки в bst.cpp отправляется объектом данных в качестве аргумента из драйвера.

Ошибки в форме

Unhandled exception at 0x0F3840D9 (msvcr120d.dll) in asgmt04.exe: 0xC0000005: 
Access violation writing location 0x00000000. 

Вот код

В bst.cpp

void BST::insert(const Data& data) 
{ 
    if (index > capacity) 
     grow(); 

    if (items[index].isEmpty == true) 
    { 
     items[index].data.setName(data.getName()); 
     nItems++; 
     items[index].isEmpty = false; 
     items[index].loc = index; 
    } 
    else if (data < items[index].data) 
    { 
     index = (2 * index) + 1; 
     insert(data); 
    } 
    else 
    { 
     index = (2 * index) + 2; 
     insert(data); 
    } 
} 

Опять же, я не могу изменить прототип функции, потому что это общественное член.

В data.h

char const * const getName() const { return name; } 

В data.cpp

void Data::setName(char const * const name) 
{ 
    strcpy(this->name, name); 
} 

Я также попытался использовать перегруженный оператор = и столкнулся с той же проблемой. Код, который назвал это выглядело как

items[index].data = data; //second arg is the one passed into insert function 

И data.cpp

Data& Data::operator=(const Data& data2) 
{ 
    strcpy(this->name, data2.name); 
    return *this; 
} 

Спасибо за любую помощь

+0

Вы разыскиваете нулевой указатель. В идеале вы получите номер строки, где это происходит, возможно, запуская в отладчике. Вероятно, это либо ваш указатель, либо указатель this-> name. Добавьте подтверждения для проверки. – kec

+0

@kec Это похоже на проблему. К сожалению, конструктор по умолчанию для объектов данных (который я не могу изменить) инициализирует имя NULL, и я инициализирую весь массив из них динамически при запуске программы. – FutureShocked

ответ

1

Я подозреваю, что во время выполнении линии

strcpy(this->name, data2.name); 

в помещении this->name недостаточно места для хранения data2.name. Вот предложение:

Data& Data::operator=(const Data& data2) 
{ 
    // Prevent self assignment. 
    if (this != &data2) 
    { 
     if (strlen(this->name) < strlen(data2.name)) 
     { 
      // Assuming that you used new to allocate memory. 
      delete [] this->name; 
      this->name = new char[strlen(data2.name) + 1]; 
     } 
     strcpy(this->name, data2.name); 
    } 
    return *this; 
} 

Update, в ответ на комментарий OP

Если Data::name позволено быть NULL, то есть должны быть больше проверок.

Data& Data::operator=(const Data& data2) 
{ 
    // Prevent self assignment. 
    if (this != &data2) 
    { 
     if (this->name == NULL) 
     { 
     if (data2.name == NULL) 
     { 
      // Nothing needs to be done. 
     } 
     else 
     { 
      this->name = new char[strlen(data2.name) + 1]; 
      strcpy(this->name, data2.name); 
     } 
     } 
     else 
     { 
     if (data2.name == NULL) 
     { 
      delete this->name; 
      this->name = NULL; 
     } 
     else 
     { 
      if (strlen(this->name) < strlen(data2.name)) 
      { 
       // Assuming that you used new to allocate memory. 
       delete [] this->name; 
       this->name = new char[strlen(data2.name) + 1]; 
      } 
      strcpy(this->name, data2.name); 
     } 
     } 
    } 
    return *this; 
} 
+0

Это вызывает еще одно необработанное исключение в строке 'if (strlen (this-> name) name' является NULL в этом пункте – FutureShocked

+0

Спасибо за помощь, что сделал это. Это позволило мне раскрыть целую кучу других вопросов, но, по крайней мере, это не так. – FutureShocked

+1

Добро пожаловать. Рад, что смог помочь. –

Смежные вопросы