在上一个问题中,发现使用最新版本的 GNU libstdc++ 从以空格分隔的人类可读文件( mirror )读取一系列数字会导致大量分配,并随文件大小线性缩放。
鉴于上面链接的文件和这个测试程序:
#include <fstream>
int main(int, char**) {
std::ifstream ww15mgh("ww15mgh.grd");
double value;
while (ww15mgh >> value);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Valgrind--tool=memcheck报告:
==523661== total heap usage: 1,038,970 allocs, 1,038,970 frees, 59,302,487
Run Code Online (Sandbox Code Playgroud)
因为这百万分配中的每一个都在operator>>返回之前立即释放,所以没有泄漏并且程序在发布版本中的实际内存占用很小(81KB)。但是,编译-fsanitize=address将大量分配变成了一个真正的问题。
以下是上述程序的总内存占用,运行和不运行 ASAN:
$ g++ stackoverflow.cpp -o _build/stackoverflow
$ /usr/bin/time -v _build/stackoverflow |& grep 'm r'
Maximum resident set size (kbytes): 3512
Run Code Online (Sandbox Code Playgroud)
$ g++ stackoverflow.cpp -o _build/stackoverflow_asan -fsanitize=address
$ /usr/bin/time -v _build/stackoverflow_asan |& grep 'm r' …Run Code Online (Sandbox Code Playgroud)