Я использовал AddressSanitizer , чтобы проверить утечку памяти для моего приложения, но меня смущает разница между этими двумя флагами: detect_leaks
против leak_check_at_exit
.
Я думал, что код нижедолжен сообщать об утечке памяти, даже когда leak_check_at_exit=0
, потому что утечка уже произошла во время каждого цикла, а не после того, как основная функция вернулась:
int main() {
void *mem;
for(int i=0; i<1000; i++) {
mem = malloc(1024);
}
return 0;
}
При detect_leaks=1:leak_check_at_exit=1
программа выдаст правильный отчет об утечке памяти:
=================================================================
==73448==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 1024000 byte(s) in 1000 object(s) allocated from:
#0 0x7f0933f053f8 in __interceptor_malloc (/usr/lib/x86_64-linux-gnu/libasan.so.3+0xc23f8)
#1 0x42c8c1 in main src/main.cpp:10
#2 0x7f0931b05ec4 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4)
Но с detect_leaks=1:leak_check_at_exit=0
он НЕ сообщает об утечке памяти.Мне кажется, что настройка leak_check_at_exit=0
эквивалентна настройке detect_leaks=0
.
Вопрос : В чем разница между detect_leaks
и leak_check_at_exit
?