Как отключить в санитайзере предупреждения при закрытии программы?
Все мы знаем, что после завершения работы программы, память возвращается ОС и лично я не знаю причин, для того, чтобы перед завершением работы вызывать деструкторы и чистить за собой память.
Однако санитайзер на это ругается.
1 Разберём пример:
#include <iostream>
int main(int argc, char *argv[])
{
int* a = new int(17);
return 0;
}
санитайзер выдал :
=================================================================
==59301==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 4 byte(s) in 1 object(s) allocated from:
#0 0x7f91118bb1c7 in operator new(unsigned long) ../../../../src/libsanitizer/asan/asan_new_delete.cpp:99
#1 0x5653388f9285 in main ../sanitizerTest/main.cpp:5
#2 0x7f9110d74d8f in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
SUMMARY: AddressSanitizer: 4 byte(s) leaked in 1 allocation(s).
Хотя я не считаю это утечкой памяти.
2 Для примера давайте используем явно эту память
#include <iostream>
void test(int* a){
*a = 17;
}
int main(int argc, char *argv[])
{
int* a = new int();
test(a);
std :: cout << *a;
return 0;
}
и всё равно санитайзер ругается :
17
=================================================================
==59580==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 4 byte(s) in 1 object(s) allocated from:
#0 0x7f6af3f7d1c7 in operator new(unsigned long) ../../../../src/libsanitizer/asan/asan_new_delete.cpp:99
#1 0x55cb1f806319 in main ../sanitizerTest/main.cpp:9
#2 0x7f6af3436d8f in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
SUMMARY: AddressSanitizer: 4 byte(s) leaked in 1 allocation(s).
3 Однако, если немного обернуть код, то санитайзер не ругается:
#include <iostream>
void test(int** a){
*a = new int(17);
}
int main(int argc, char *argv[])
{
int* a;
test(&a);
std :: cout << *a;
return 0;
}
PS: оптимизацию отключил , мой qmake:
CONFIG += c++20 console
QMAKE_CXXFLAGS_RELEASE -= -O0
SOURCES += \
main.cpp
Подскажите пожалуйста, почему в первых 2 случаях санитайзер ругается, а в последнем нет? Хотя и там и там я не чищу память после себя.
И если я всё правильно понимаю и нигде не ошибаюсь, как сделать так, чтобы в первых 2 случаях санитайзер не ругался?