2015-08-17 2 views
0

Я только начинаю изучать C++, и я создал простую связанную программу. Проблема в том, что он получает исключения, которые выбрасываются из него из библиотеки строк и при печати списка. Я сузил его до ошибки, когда я вызываю malloc, но я не знаю, как это исправить, или другое исключение.Получение исключений в библиотеке строк

// linkedlists.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include <iostream> 
#include <string> 
using namespace std; 
struct person { 
    string name; 
    int age; 
    struct person* next; 
}; 
person *head = NULL; 
int length() { 
    int count = 0; 
    person *current = head; 
    while (current->age != NULL) { 
     current = current->next; 
     count++; 
    } 
    return count; 
} 
void printlist() { 
    person * current = head; 
    while (current->next != NULL){ //exception is here. 
     cout << "Name: " << current->name << " Age: " << current->age <<   "\n"; 
     current = current->next; 
    } 
} 
void insert() { 
// int choice; 
    person *newNode = (struct person*) malloc(sizeof(person));//assuming exception is here because it is showing an exception at the size function in string library, and the struct person has string name. 
    //cout << "Press 1 to insert at beginning of list.\n"; 
    //cin >> choice; 
// switch (choice) { 
    //case 1: 

    *newNode->next = *head; 
    cout << "What is this person's name?\n"; 
    cin >> newNode->name; 
    cout << "\nWhat is the age of " << newNode->name << "?"; 
    cin >> newNode->age; 
    cout << "The current list of people is " << length() << " long.\n"; 
    printlist(); 

} 
void menu() { 
    int choice; 
    cout << "Welcome to the person recorder! "; 
    bool inloop = true; 
    while (inloop) { 
     cout << "Press 1 to add more entries. Press 2 to print the entire list. Press 3 to exit the program.\n"; //error in string when i press 1. error in the while loop when i press 2. 
     cin >> choice; 
     switch (choice) { 
     case 1: 
      insert(); 
     case 2: 
      printlist(); 
     case 3: 
      inloop = false; 
     } 
    } 
} 
/*void change(person* human) { 
    string temp_name; 
    int temp_age; 
    cout << "What is this person's name?\n"; 
    cin >> temp_name; 
    cout << "\nWhat is this person's age?\n"; 
    cin >> temp_age; 
    human->name = temp_name; 
    human->age = temp_age; 
} 
*/ 
int main() 
{ 
    menu(); 
} 
+5

Это домашнее задание? Если да, то ваш профессор должен прекратить преподавать «C++». –

+0

. Вы должны иметь возможность отслеживать, где именно исключение, из которого происходит ваша программа, происходит с помощью отладчика. Вы также на самом деле не указали ошибку, которую вы получили. «Исключения» могут означать больше, чем несколько вещей. Они могут быть исключениями, указанными для отказа от недопустимых аргументов (например, 'std :: stoi', получающих строку, которая не является числом). Они могут быть помещены туда посредством реализации для чего-то, что стандарт менее любезен (например, создавая 'std :: string' из нулевого указателя с GCC). Они могут даже не быть исключениями C++ (например, SEH в Windows). У всех есть сообщения об ошибках. – chris

ответ

2

Вы используете malloc в структуре, которая содержит член класса C++ (std :: string в этом случае). Это проблема, потому что построение объектов C++ не произойдет. Как правило, вы хотите использовать оператор new вместо вызова malloc в C++.

+0

Я имею в виду, что вы не хотели бы использовать 'new', но умный указатель, если бы вам пришлось. Но 'new', безусловно, лучше, чем' malloc' здесь. – chris

+0

@chris Я согласен, это еще один случай прославления C в среде C++. –

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