内存解除分配后冻结程序

问题描述 投票:-2回答:1

在我的内存释放过程中,我的代码存在一些问题。这是我得到的错误: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;
}

正如你所看到的那样,我得到了“制作出来”的通知,但我的程序被冻结了,不允许我做任何事情。有什么想法吗?

c++ arrays string memory-management dynamic
1个回答
3
投票

这是可怕的UB。您分配长度为char0数组,然后轻轻地将数据输入其中:保证缓冲区溢出!

尝试使用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。但是如果你有很多代码已经很好地与char数组一起工作并且真的不想触摸它,那么你可以使用string x;传递const char*作为x.c_str()参数。

© www.soinside.com 2019 - 2024. All rights reserved.