我第一次看到这种语法:cin >> (ptr = new char);
这是一种动态分配内存的可靠方法吗?有什么可能的陷阱?
int main()
{
char* charPtr;
std::cout << "Enter a string: ";
std::cin.getline((charPtr = new char), 5);//What's happening here?
std::cout << charPtr << "\n";
std::cout << "length: " << strlen(charPtr) << "\n";
std::cin.clear();///Clearing eventually errors flags
//Ignoring remained chars of the buffer.
std::cin.ignore(std::numeric_limits<int>::max(), '\n');
delete [] charPtr;//freeing memory
std::cout << "Enter a word: ";
std::cin >> (charPtr = new char);//ALLOCATING MEMORY FOR 1 CHAR
std::cout << charPtr << "\n";
std::cout << "length: " << strlen(charPtr) << "\n";
delete [] charPtr;//CRASH
return 0;
}
答案 0 :(得分:4)
std::cin.getline((charPtr = new char), 5);
这只为一个字符分配空间,必须由空终止符占用。因此,如果用户在此行上输入任何字符,则会导致缓冲区溢出,未定义的行为。
delete [] charPtr;
未定义的行为,因为您分配了new
,而不是new[]
。
std::cin >> (charPtr = new char);
保证缓冲区溢出,除非用户终止标准输入(例如在Windows上使用ctrl-z),因为这将至少读取一个字符,并存储至少2个(读取的字符,加上null)终止子)。
delete [] charPtr;
我想你现在可以猜到这是什么。