当 getline() 读取大于系统内存的行时会发生什么?

What happens when getline() reads a line that is larger than system memory?

假设 C++ getline() 从某个文件中读取,该文件具有超过系统内存容量的单个大行(在超过内存容量之前没有换行符)。那么 while(getline(cin, line)) 循环会做什么?

而且,如果我需要通过抛出异常或其他方式来处理这种可能的边缘情况,我该怎么做?

好吧,假设系统的内存容量小于 std::string::max_size() (this could correspond to over 8 million terabytes on a 64-bit system 1), then the getline() function would, at some stage, throw a std::bad_alloc 异常的值,因为 STL 实现尝试(但失败)分配额外的 space 给 std::string对象作为第二个参数传递给 getline() 调用。

因此,您只需要将 getline 调用包含在 try 块中,并 catch 该异常。

如果(不太可能?)您的系统 确实 有超过上述 max_size() 个可用内存字节,那么 getline 调用将set the failbit flag 和 return 当字符串达到该限制时。


1 例如,在我的 64 位 Windows 系统上使用 Visual Studio 19,max_len() returns 9223372036854775807,即 8,388,607 TB。

来自 cppreference(重点是我的):

Extracts characters from input and appends them to str until one of the following occurs ... c) str.max_size() characters have been stored, in which case getline sets failbit and returns.

理论上,standard-complying 实现可以 max_size() 返回比可用虚拟内存更低的值,在这种情况下,读取将停在那里。通常,情况并非如此,内存会先耗尽。添加下一个字符将触发失败的分配处理机制,默认情况下会抛出 std::bad_alloc.

因此,要处理错误,您可以 catch(std::bad_alloc&){/*...*/}.

如果 std::getline() 最多读取 std::string::max_size() 个字符,它会停止读取并在输入流上设置 failbit 标志。

std::string 很可能会在发生之前很久就抛出类似 std::bad_alloc 的内存错误。