std::string operator+() memory leak?

前端 未结 3 1997
南笙
南笙 2021-02-13 16:03

I\'m quite worry because I wrote a little application and it seems that there is a memory leak if I believe valgrind (What I actually do):

==9321== 251 bytes in          


        
相关标签:
3条回答
  • 2021-02-13 16:19

    To quote Valgrind FAQ

    With GCC 2.91, 2.95, 3.0 and 3.1, compile all source using the STL with -D__USE_MALLOC. Beware! This was removed from GCC starting with version 3.3.

    With GCC 3.2.2 and later, you should export the environment variable GLIBCPP_FORCE_NEW before running your program.

    With GCC 3.4 and later, that variable has changed name to GLIBCXX_FORCE_NEW.

    Also discussed in GCC FAQ

    0 讨论(0)
  • 2021-02-13 16:21

    I would not worry too much about STL leaks.

    The default STL allocator (for gcc) uses clever tricks to maximize efficiency that Valgrind often reports as leaks. Notably it pools memory, meaning that it keeps memory around when you clear a string and may reuse it next time you insert in a map or a vector for example.

    I don't think the pool itself is properly disposed of at the end of the program, probably to avoid the Static Destruction Order Fiasco (ie, imagine that the pool is disposed of and you then request memory, urk). Thus it leaks... right before your program ends and the OS gets the memory back forcefully.

    0 讨论(0)
  • 2021-02-13 16:38

    I suspect what's happening is the compiler is using NRVO to put your temporary string into its real return location. That return string is then stored inside an object that's allocated and leaked off the heap.

    0 讨论(0)
提交回复
热议问题