在我的内存释放过程中,我的代码存在一些问题。这是我得到的错误:
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;
}
正如你所看到的那样,我得到了“制作出来”的通知,但我的程序被冻结了,不允许我做任何事情。有什么想法吗?
这是可怕的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
。但是如果你有很多代码已经很好地与char数组一起工作并且真的不想触摸它,那么你可以使用string x;
传递const char*
作为x.c_str()
参数。