новый libstdc++ из gcc5.1 может выделять большую память в куче

valgrind обнаруживает «все еще достижимую утечку» в пустой программе, скомпилированной с помощью gcc5.1, g++ ./a.cpp,

int main () {}

валгринд говорит, valgrind ./a.out,

==32037== HEAP SUMMARY:
==32037==     in use at exit: 72,704 bytes in 1 blocks
==32037==   total heap usage: 1 allocs, 0 frees, 72,704 bytes allocated
==32037== 
==32037== LEAK SUMMARY:
==32037==    definitely lost: 0 bytes in 0 blocks
==32037==    indirectly lost: 0 bytes in 0 blocks
==32037==      possibly lost: 0 bytes in 0 blocks
==32037==    still reachable: 72,704 bytes in 1 blocks
==32037==         suppressed: 0 bytes in 0 blocks
==32037== Rerun with --leak-check=full to see details of leaked memory
==32037== 
==32037== For counts of detected and suppressed errors, rerun with: -v
==32037== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 5 from 5)

Для программ на языке C valgrind не сообщает об утечках памяти и выделении памяти. Кроме того, для gcc5.0 и gcc4.9.2 valgrinds не сообщает об утечках памяти и выделении памяти. Тогда я предполагаю, что причиной является новый libstdc++ gcc5.1.

Мой вопрос в том, как уменьшить это огромное выделение памяти, которое может быть в libstdС++. Действительно, время выполнения этой пустой программы на C++, скомпилированной с помощью -O3, больше, чем у пустой программы на C, на несколько миллисекунд (без системного времени).


person akakatak    schedule 22.05.2015    source источник
comment
ваш файл только int main () {} ? или у него есть включения и тому подобное?   -  person Eregrith    schedule 22.05.2015
comment
файлы, указанные пользователем, не включены или не связаны. int main () {} — это именно содержимое, а g++ ./a.cpp — это команда компиляции, которую я использовал.   -  person akakatak    schedule 22.05.2015
comment
Так что на самом деле это только int main () {}... вау gcc... вау....   -  person Eregrith    schedule 22.05.2015
comment
Что вам дает gcc -E a.cpp? Как выглядит .o?   -  person Eregrith    schedule 22.05.2015
comment
g++ -E a.cpp говорит:     # 1 test.cpp     # 1 ‹встроенный›     # 1 ‹command-line›     # 1 test.cpp     int main() {}   Мне кажется, что это обычный .objfile Нет незнакомых символов. Во всяком случае, ссылка, предложенная пользователем 657267, может что-то сказать по существу.   -  person akakatak    schedule 22.05.2015


Ответы (1)


Пространство выделяется как аварийный буфер исключений в libsup++.

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64535

разработчики говорят о возможном подавлении трассировки в Valgrind, но, по-видимому, в итоге ничего не было сделано. Единственный способ исключить его из трассировки прямо сейчас, вероятно, состоит в том, чтобы отключить исключения, но это не похоже на то, что это имеет большое значение, это не значит, что память может быть освобождена для чего-то еще до выхода из программы.

person user657267    schedule 22.05.2015
comment
Это определенно нуждается в подавлении в Valgrind, потраченных впустую полчаса на поиск моей утечки, прежде чем я наткнулся на эту тему SO... - person XapaJIaMnu; 28.05.2015
comment
Похоже, они исправили проблему, теперь нам просто нужно подождать, пока наш дистрибутив наверстает упущенное! - person nic; 26.01.2016
comment
@nic У вас есть какие-либо ресурсы по поводу вашего комментария? - person akakatak; 16.02.2016
comment
Я нашел эту статью wiki.wxwidgets.org/Valgrind_Suppression_File_Howto полезной в том, что она рассказала мне, как создать подавление valgrind. Мое подавление (для gcc 5.4.0): { ‹Подавить утечку буфера исключения в libstdc++› Memcheck:Leak match-leak-kinds:reachable fun:malloc obj:/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0 .21 fun:call_init.part.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.23.so } - person RichardHowells; 18.08.2016