gpt4 book ai didi

c++ - 直接使用cin和operator分配内存>>

转载 作者:行者123 更新时间:2023-11-30 01:51:54 24 4
gpt4 key购买 nike

我第一次看到这种语法: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;
}

最佳答案

std::cin.getline((charPtr = new char), 5);

这仅为一个字符分配了空间,该字符必须由空终止符占用。因此,如果用户在此行输入任何字符,就会导致缓冲区溢出,这是未定义的行为。

delete [] charPtr;

未定义的行为,因为您分配的是 new,而不是 new[]

std::cin >> (charPtr = new char);

保证缓冲区溢出,除非用户终止标准输入(例如在 Windows 上使用 ctrl-z),因为这将必须读取至少一个字符,并至少存储 2 个(读取的字符,加上空字符)终止符)。

delete [] charPtr;

我想你现在可以猜出这是什么了。

关于c++ - 直接使用cin和operator分配内存>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25502509/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com