Завершение вызывается после создания экземпляра ‘std:: length_error’ что(): basic_string::_S_create Прервано

#c #function #class #pointers #binary-search-tree

#c #функция #класс #указатели #двоичное дерево поиска

Вопрос:

Это сообщение об ошибке, о котором идет речь: завершение вызывается после создания экземпляра ‘std:: length_error’ what(): basic_string:: _S_create Прервано

Это код, который его запускает. Этот раздел в main.cpp файл:

   case '-':   // DeleteItem
              try
              {
                int id;
                inputs >> id;
                Student s(id, "NULL", "NULL");
                cout << "DeleteItem('" << id << "') -- ";
                s = tPtr->DeleteItem(s);
                cout << "Deleted  ";
                s.Print();
              }
  

Он никогда не проходит мимо tPtr-> DeleteItem (ов), и это код, используемый для DeleteItem (ов).
Функция DeleteItem:

       template <typename SomeType>
      SomeType BSTree<SomeType>::DeleteItem(SomeType item){
      if (rootPtr == NULL){
      throw EmptyBSTree();
      }
      Delete(rootPtr, item);
      cout<<"done"<<endl;
      } 
  

Функция удаления:

 template <typename SomeType>
void BSTree<SomeType>::Delete(BSTreeNode<SomeType>*amp; treePtr, SomeTypeamp; item){


if (treePtr->data == item){

DeleteNode(treePtr);
cout<<"done2"<<endl;
}
else{

if (item<treePtr->data){

if (treePtr->leftPtr != NULL){
Delete(treePtr->leftPtr, item);
}

else{
throw NotFoundBSTree();
}
}
else{
if (treePtr->rightPtr != NULL){
Delete(treePtr->rightPtr, item);
}

else{
throw NotFoundBSTree();
}
}
}
  

Функция deleteNode:

 template <typename SomeType>
void BSTree<SomeType>::DeleteNode(BSTreeNode<SomeType>*amp; treePtr){
cout<<"here"<<endl;
BSTreeNode<SomeType>* temp = new BSTreeNode<SomeType>;
temp = treePtr;
if (treePtr->leftPtr == NULL amp;amp; treePtr->rightPtr == NULL){


delete temp;

}
else{

if (treePtr->leftPtr == NULL){
treePtr = treePtr->rightPtr;
delete temp;
}

else if (treePtr->rightPtr == NULL){
treePtr = treePtr->leftPtr;
delete temp;
}

else{
treePtr->data = GetPredecessor(treePtr->leftPtr);
Delete(treePtr->leftPtr,treePtr->data);
}
}
cout<<"I am here"<<endl;
}
  

Я нахожу это очень странным, поскольку все операторы cout, которые я ввожу, чтобы убедиться, что код попадает в эту строку, выводятся на терминал, поэтому он завершает обе функции, но никогда не проходит мимо исходной строки в main.cpp . Я очень смущен тем, почему я продолжаю получать эту ошибку.

РЕДАКТИРОВАТЬ: эта проблема была решена путем добавления возврата к DeleteItem . Однако я столкнулся с другой проблемой. Удаление, похоже, здесь не работает:

 template <typename SomeType>
void BSTree<SomeType>::DeleteNode(BSTreeNode<SomeType>*amp; treePtr){
BSTreeNode<SomeType>* temp;
temp = treePtr;
if (treePtr->leftPtr == NULL amp;amp; treePtr->rightPtr == NULL){
delete temp;
cout<<"This is "<<treePtr->data<<endl;
}
else{
if (treePtr->leftPtr == NULL){
treePtr = treePtr->rightPtr;
delete temp;
}

else if (treePtr->rightPtr == NULL){
treePtr = treePtr->leftPtr;
delete temp;
}

else{
treePtr->data = GetPredecessor(treePtr->leftPtr);
Delete(treePtr->leftPtr,treePtr->data);
}
}

}
  

Дерево Ptr должно быть удалено, но оно выводится
Это (случайное число). Почему?

Комментарии:

1. Похоже, вам нужен оператор return BSTree<SomeType>::DeleteItem .

2. Включите предупреждения вашего компилятора. Компиляторы с радостью предупредят о пропущенных операторах возврата.

3. @chris как мне это сделать? Я нахожусь на удаленном сервере Linux, но я могу быть на нем некоторое время, поэтому я бы предпочел

4. При выполнении man gcc вы получите понятный список всех параметров компиляции, включая тот, который вы ищете. Знакомы ли вы с man командой и что она делает?

5. Не совсем, но я прочитаю об этом!