当 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
的内存错误。
假设 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
的内存错误。