C++ 在抛出';标准:长度误差';what():基本\u字符串::\u S\u创建已中止

C++ 在抛出';标准:长度误差';what():基本\u字符串::\u S\u创建已中止,c++,function,class,pointers,binary-search-tree,C++,Function,Class,Pointers,Binary Search Tree,这是有问题的错误消息: 在抛出“std::length_error”实例后调用terminate what():基本字符串::\u S\u创建 流产 这是触发它的代码。 main.cpp文件中的此部分: case '-': // DeleteItem try { int id; inputs >> id; Student s(

这是有问题的错误消息: 在抛出“std::length_error”实例后调用terminate what():基本字符串::\u S\u创建 流产

这是触发它的代码。 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();
              }
case'-'://删除项
尝试
{
int-id;
输入>>id;
学生s(id,“空”、“空”);
cout leftPtr,treePtr->data);
}
}
coutrightPtr==NULL){
删除临时文件;
coutdata=getpreceptor(treePtr->leftPtr);
删除(treePtr->leftPtr,treePtr->data);
}
}
}
应该删除树Ptr,但它会打印出来
这是(随机数)。为什么?

看起来您需要在
bTree::DeleteItem
中使用返回语句。请打开编译器警告。编译器会很高兴地警告丢失的返回语句。@chris我该怎么做?我在一个远程linux服务器上,但我可能在上面呆了一段时间,所以我更希望如果您执行
mangcc
,您将得到一个所有编译选项的可理解列表,包括您正在寻找的选项。您是否熟悉
man
命令,以及它的功能?不太熟悉,但我会详细了解它!
      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>*& treePtr, SomeType& 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();
}
}
}
template <typename SomeType>
void BSTree<SomeType>::DeleteNode(BSTreeNode<SomeType>*& treePtr){
cout<<"here"<<endl;
BSTreeNode<SomeType>* temp = new BSTreeNode<SomeType>;
temp = treePtr;
if (treePtr->leftPtr == NULL && 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;
}
template <typename SomeType>
void BSTree<SomeType>::DeleteNode(BSTreeNode<SomeType>*& treePtr){
BSTreeNode<SomeType>* temp;
temp = treePtr;
if (treePtr->leftPtr == NULL && 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);
}
}

}