Программа зависла после удаления памяти - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть некоторые проблемы с моим кодом в процессе освобождения памяти.Вот ошибка, которую я получаю: I make it to the part where my memory should be deallocated but instead of deallocation I get an infinite loop

bool LinkedList::addArtist(){
    cout << "Enter artist name: ";
    char *name = new char[0]();
    cin >> name;
    cin.ignore(1);
    '/n';

    cout << "Enter artists top story: ";
    char *topStory = new char[0];
    cin >> topStory;
    cin.ignore(1);
    '/n';

    cout << "Enter artist description: ";
    char *description = new char[0];
    cin >> description;
    cin.ignore(1);
    '/n';

    this->addAtBeginning(*&name, *&topStory, *&description);

    cout << "made it out" << endl;
    delete[] name;
    delete[] topStory;
    delete[] description;
    return true;
}

Как вы можете видеть, я получаю уведомление "сделано", но моя программа зависает и не позволяет мнеделать что-либо.Есть мысли?

1 Ответ

3 голосов
/ 18 апреля 2019

Это ужасный UB.Вы выделяете char массивы длиной 0, а затем аккуратно вводите в них данные: переполнение буфера гарантировано!

Попробуйте использовать string вместо char[].Он не только справляется с динамической длиной, но и освобождает вас от обязанности ручного управления памятью.

bool LinkedList::addArtist(){
    cout << "Enter artist name: ";
    string name;
    getline (cin, name);  // allows blanks in string and ignores \n

    ...      

    this->addAtBeginning(name, topStory, description);

    cout << "made it out" << endl;
    return true;
}

Если остальная часть кода использует char массивы таким же образом, просторефакторинг всего на string.Но если у вас есть много кода, который уже хорошо работает с массивами символов и действительно не хотите его трогать, тогда вы можете передать string x; в качестве параметра const char* с x.c_str().

...