TanmayPatil105 / procfetch

🎨 Yet another command-line system information utility written in C++
https://tanmaypatil105.github.io/procfetch/
GNU General Public License v3.0
23 stars 11 forks source link

Memory leaks #156

Closed TanmayPatil105 closed 5 months ago

TanmayPatil105 commented 5 months ago

We don't handle memory well.

Valgrind

valgrind logs after running procfetch:

==93500== Memcheck, a memory error detector
==93500== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al.
==93500== Using Valgrind-3.22.0-bd4db67b1d-20231031 and LibVEX; rerun with -h for copyright info
==93500== Command: procfetch
==93500== 
--93500-- Valgrind options:
--93500--    --leak-check=full
--93500--    --show-leak-kinds=all
--93500--    --track-origins=yes
--93500--    --verbose
--93500-- Contents of /proc/version:
--93500--   Linux version 6.8.0-35-generic (buildd@lcy02-amd64-020) (x86_64-linux-gnu-gcc-13 (Ubuntu 13.2.0-23ubuntu4) 13.2.0, GNU ld (GNU Binutils for Ubuntu) 2.42) #35-Ubuntu SMP PREEMPT_DYNAMIC Mon May 20 15:51:52 UTC 2024
--93500-- 
--93500-- Arch and hwcaps: AMD64, LittleEndian, amd64-cx16-lzcnt-rdtscp-sse3-ssse3-avx-avx2-bmi-f16c-rdrand-rdseed
--93500-- Page sizes: currently 4096, max supported 4096
--93500-- Valgrind library directory: /usr/libexec/valgrind
--93500-- Reading syms from /usr/bin/procfetch
--93500-- Reading syms from /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
--93500--   Considering /usr/lib/debug/.build-id/3e/81740f816ee1521a87e439c16ebfde46f147a5.debug ..
--93500--   .. build-id is valid
--93500-- Reading syms from /usr/libexec/valgrind/memcheck-amd64-linux
--93500--    object doesn't have a dynamic symbol table
--93500-- Scheduler: using generic scheduler lock implementation.
--93500-- Reading suppressions file: /usr/libexec/valgrind/default.supp
==93500== embedded gdbserver: reading from /tmp/vgdb-pipe-from-vgdb-to-93500-by-tanmay-on-???
==93500== embedded gdbserver: writing to   /tmp/vgdb-pipe-to-vgdb-from-93500-by-tanmay-on-???
==93500== embedded gdbserver: shared mem   /tmp/vgdb-pipe-shared-mem-vgdb-93500-by-tanmay-on-???
==93500== 
==93500== TO CONTROL THIS PROCESS USING vgdb (which you probably
==93500== don't want to do, unless you know exactly what you're doing,
==93500== or are doing some strange experiment):
==93500==   /usr/bin/vgdb --pid=93500 ...command...
==93500== 
==93500== TO DEBUG THIS PROCESS USING GDB: start GDB like this
==93500==   /path/to/gdb procfetch
==93500== and then give GDB the following command
==93500==   target remote | /usr/bin/vgdb --pid=93500
==93500== --pid is optional if only one valgrind process is running
==93500== 
--93500-- REDIR: 0x4028b00 (ld-linux-x86-64.so.2:strlen) redirected to 0x580c2e1a (???)
--93500-- REDIR: 0x40272b0 (ld-linux-x86-64.so.2:index) redirected to 0x580c2e34 (???)
--93500-- Reading syms from /usr/libexec/valgrind/vgpreload_core-amd64-linux.so
--93500-- Reading syms from /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so
==93500== WARNING: new redirection conflicts with existing -- ignoring it
--93500--     old: 0x04028b00 (strlen              ) R-> (0000.0) 0x580c2e1a ???
--93500--     new: 0x04028b00 (strlen              ) R-> (2007.0) 0x0484f340 strlen
--93500-- REDIR: 0x40274e0 (ld-linux-x86-64.so.2:strcmp) redirected to 0x4850460 (strcmp)
--93500-- REDIR: 0x4026910 (ld-linux-x86-64.so.2:mempcpy) redirected to 0x4853cd0 (mempcpy)
--93500-- Reading syms from /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.33
--93500-- Reading syms from /usr/lib/x86_64-linux-gnu/libgcc_s.so.1
--93500-- Reading syms from /usr/lib/x86_64-linux-gnu/libc.so.6
--93500--   Considering /usr/lib/debug/.build-id/08/134323d00289185684a4cd177d202f39c2a5f3.debug ..
--93500--   .. build-id is valid
--93500-- Reading syms from /usr/lib/x86_64-linux-gnu/libm.so.6
--93500-- REDIR: 0x4028ca0 (ld-linux-x86-64.so.2:strncmp) redirected to 0x484fc90 (strncmp)
--93500-- REDIR: 0x4bd2040 (libc.so.6:strnlen) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4bd20d0 (libc.so.6:strpbrk) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4bd0190 (libc.so.6:strcmp) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4be93b0 (libc.so.6:wcsnlen) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4bcf280 (libc.so.6:memset) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4be8b20 (libc.so.6:wcslen) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4c543c0 (libc.so.6:__memcpy_chk) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4bcf1f0 (libc.so.6:memrchr) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4be9350 (libc.so.6:wcsncpy) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4bce710 (libc.so.6:memcpy@@GLIBC_2.14) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4be78e0 (libc.so.6:wcschr) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4bd0080 (libc.so.6:index) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4bd2100 (libc.so.6:rindex) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4be7990 (libc.so.6:wcscmp) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4bcf4a0 (libc.so.6:stpncpy) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4bf5eb0 (libc.so.6:wmemchr) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4bd1ee0 (libc.so.6:strncmp) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4bcf500 (libc.so.6:strcasecmp) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4bd1300 (libc.so.6:strcspn) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4be88f0 (libc.so.6:wcscpy) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4bd0010 (libc.so.6:strcat) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4bd1de0 (libc.so.6:strncasecmp_l) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4bd0100 (libc.so.6:strchrnul) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4bce620 (libc.so.6:bcmp) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4bd1290 (libc.so.6:strcpy) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4bcf5a0 (libc.so.6:strcasecmp_l) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4bd1cb0 (libc.so.6:strlen) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4bd1f80 (libc.so.6:strncpy) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4bf5f30 (libc.so.6:wmemcmp) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4c544e0 (libc.so.6:__memmove_chk) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
==93500== WARNING: new redirection conflicts with existing -- ignoring it
--93500--     old: 0x04ca59d0 (__memcpy_chk_avx_una) R-> (2030.0) 0x04853dd0 __memcpy_chk
--93500--     new: 0x04ca59d0 (__memcpy_chk_avx_una) R-> (2024.0) 0x04853740 __memmove_chk
--93500-- REDIR: 0x4bcf430 (libc.so.6:stpcpy) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4bcefb0 (libc.so.6:memmove) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
==93500== Preferring higher priority redirection:
--93500--     old: 0x04ca5a00 (__memcpy_avx_unalign) R-> (2018.0) 0x04851580 __memcpy_avx_unaligned_erms
--93500--     new: 0x04ca5a00 (__memcpy_avx_unalign) R-> (2018.1) 0x04852d60 memmove
--93500-- REDIR: 0x4bce5a0 (libc.so.6:memchr) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4bd22d0 (libc.so.6:strspn) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4bcf0d0 (libc.so.6:mempcpy) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4bd1d40 (libc.so.6:strncasecmp) redirected to 0x483d1c0 (_vgnU_ifunc_wrapper)
--93500-- REDIR: 0x4caa5f0 (libc.so.6:__strrchr_avx2) redirected to 0x484ed20 (rindex)
--93500-- REDIR: 0x4ca8740 (libc.so.6:__strlen_avx2) redirected to 0x484f220 (strlen)
--93500-- REDIR: 0x4ca52a0 (libc.so.6:__memcmp_avx2_movbe) redirected to 0x4852480 (bcmp)
--93500-- REDIR: 0x4ca9820 (libc.so.6:__strncmp_avx2) redirected to 0x484fab0 (strncmp)
--93500-- REDIR: 0x4bca640 (libc.so.6:malloc) redirected to 0x48467b0 (malloc)
--93500-- REDIR: 0x4ca5a00 (libc.so.6:__memcpy_avx_unaligned_erms) redirected to 0x4852d60 (memmove)
--93500-- REDIR: 0x492e5c0 (libstdc++.so.6:operator new(unsigned long)) redirected to 0x4846f30 (operator new(unsigned long))
--93500-- REDIR: 0x4ca7b60 (libc.so.6:__strchr_avx2) redirected to 0x484ef00 (index)
--93500-- REDIR: 0x492e620 (libstdc++.so.6:operator new[](unsigned long)) redirected to 0x4848550 (operator new[](unsigned long))
--93500-- REDIR: 0x4ca5000 (libc.so.6:__memchr_avx2) redirected to 0x48504e0 (memchr)
--93500-- REDIR: 0x492c7c0 (libstdc++.so.6:operator delete(void*, unsigned long)) redirected to 0x484a530 (operator delete(void*, unsigned long))
--93500-- REDIR: 0x492c7e0 (libstdc++.so.6:operator delete[](void*)) redirected to 0x484bec0 (operator delete[](void*))
--93500-- REDIR: 0x4bcad20 (libc.so.6:free) redirected to 0x4849820 (free)

--93500-- REDIR: 0x4ca59c0 (libc.so.6:__mempcpy_avx_unaligned_erms) redirected to 0x48538d0 (mempcpy)
   __  __ __                   __        
  / / / // /_   __  __ ____   / /_ __  __
 / / / // __ \ / / / // __ \ / __// / / /
/ /_/ // /_/ // /_/ // / / // /_ / /_/ / 
\____//_.___/ \__,_//_/ /_/ \__/ \__,_/  

tanmay@tanmay-lenovo

--93500-- REDIR: 0x4bcb090 (libc.so.6:realloc) redirected to 0x484db00 (realloc)
OS : Ubuntu 24.04 LTS x86_64
Host : 81DE Lenovo ideapad 330-15IKB
Kernel : 6.8.0-35-generic
--93500-- REDIR: 0x4ca6400 (libc.so.6:__memset_avx2_unaligned_erms) redirected to 0x4852c50 (memset)
UpTime : 9 hours, 44 mins
RAM : 2972MiB / 7848MiB
shell : fish
DE : ubuntu:GNOME
Resolution : 1366x768
Theme : Yaru-red-dark
Icons : Yaru-red
CPU : Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz
--93500-- REDIR: 0x4ca7da0 (libc.so.6:__strchrnul_avx2) redirected to 0x48537b0 (strchrnul)
CPU Temperature : 44.5 °C
GPU : Intel Corporation UHD Graphics 620
GPU : NVIDIA Corporation GP108M [GeForce MX150]
--93500-- REDIR: 0x4bcb790 (libc.so.6:calloc) redirected to 0x484d8a0 (calloc)
Packages : 2710 dpkg; 49 flatpak; 14 snap; 

==93500== 
==93500== HEAP SUMMARY:
==93500==     in use at exit: 497,891 bytes in 12 blocks
==93500==   total heap usage: 320 allocs, 308 frees, 1,232,857 bytes allocated
==93500== 
==93500== Searching for pointers to 12 not-freed blocks
==93500== Checked 150,352 bytes
==93500== 
==93500== 31 bytes in 1 blocks are indirectly lost in loss record 1 of 8
==93500==    at 0x4846FA3: operator new(unsigned long) (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==93500==    by 0x11EE60: std::__new_allocator<char>::allocate(unsigned long, void const*) (in /usr/bin/procfetch)
==93500==    by 0x11BA4A: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_S_allocate(std::allocator<char>&, unsigned long) (in /usr/bin/procfetch)
==93500==    by 0x11B951: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_create(unsigned long&, unsigned long) (in /usr/bin/procfetch)
==93500==    by 0x122341: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_mutate(unsigned long, unsigned long, char const*, unsigned long) (in /usr/bin/procfetch)
==93500==    by 0x120951: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::push_back(char) (in /usr/bin/procfetch)
==93500==    by 0x11E484: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator+=(char) (in /usr/bin/procfetch)
==93500==    by 0x11A499: Command::exec(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (in /usr/bin/procfetch)
==93500==    by 0x10F7B8: getTheme[abi:cxx11]() (in /usr/bin/procfetch)
==93500==    by 0x1270CF: DisplayInfo(bool) (in /usr/bin/procfetch)
==93500==    by 0x1264E2: main (in /usr/bin/procfetch)
==93500== 
==93500== 48 bytes in 1 blocks are definitely lost in loss record 2 of 8
==93500==    at 0x4846FA3: operator new(unsigned long) (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==93500==    by 0x11A1F1: Command::exec(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (in /usr/bin/procfetch)
==93500==    by 0x10DF0D: getHardwarePlatform[abi:cxx11]() (in /usr/bin/procfetch)
==93500==    by 0x126957: DisplayInfo(bool) (in /usr/bin/procfetch)
==93500==    by 0x1264E2: main (in /usr/bin/procfetch)
==93500== 
==93500== 48 bytes in 1 blocks are definitely lost in loss record 3 of 8
==93500==    at 0x4846FA3: operator new(unsigned long) (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==93500==    by 0x11A1F1: Command::exec(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (in /usr/bin/procfetch)
==93500==    by 0x10F8C9: getIcons[abi:cxx11]() (in /usr/bin/procfetch)
==93500==    by 0x127181: DisplayInfo(bool) (in /usr/bin/procfetch)
==93500==    by 0x1264E2: main (in /usr/bin/procfetch)
==93500== 
==93500== 79 (48 direct, 31 indirect) bytes in 1 blocks are definitely lost in loss record 4 of 8
==93500==    at 0x4846FA3: operator new(unsigned long) (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==93500==    by 0x11A1F1: Command::exec(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (in /usr/bin/procfetch)
==93500==    by 0x10F7B8: getTheme[abi:cxx11]() (in /usr/bin/procfetch)
==93500==    by 0x1270CF: DisplayInfo(bool) (in /usr/bin/procfetch)
==93500==    by 0x1264E2: main (in /usr/bin/procfetch)
==93500== 
==93500== 241 bytes in 1 blocks are indirectly lost in loss record 5 of 8
==93500==    at 0x4846FA3: operator new(unsigned long) (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==93500==    by 0x11EE60: std::__new_allocator<char>::allocate(unsigned long, void const*) (in /usr/bin/procfetch)
==93500==    by 0x11BA4A: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_S_allocate(std::allocator<char>&, unsigned long) (in /usr/bin/procfetch)
==93500==    by 0x11B951: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_create(unsigned long&, unsigned long) (in /usr/bin/procfetch)
==93500==    by 0x122341: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_mutate(unsigned long, unsigned long, char const*, unsigned long) (in /usr/bin/procfetch)
==93500==    by 0x120951: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::push_back(char) (in /usr/bin/procfetch)
==93500==    by 0x11E484: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator+=(char) (in /usr/bin/procfetch)
==93500==    by 0x11A499: Command::exec(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (in /usr/bin/procfetch)
==93500==    by 0x10FE28: getGPU[abi:cxx11]() (in /usr/bin/procfetch)
==93500==    by 0x1273FB: DisplayInfo(bool) (in /usr/bin/procfetch)
==93500==    by 0x1264E2: main (in /usr/bin/procfetch)
==93500== 
==93500== 289 (48 direct, 241 indirect) bytes in 1 blocks are definitely lost in loss record 6 of 8
==93500==    at 0x4846FA3: operator new(unsigned long) (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==93500==    by 0x11A1F1: Command::exec(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (in /usr/bin/procfetch)
==93500==    by 0x10FE28: getGPU[abi:cxx11]() (in /usr/bin/procfetch)
==93500==    by 0x1273FB: DisplayInfo(bool) (in /usr/bin/procfetch)
==93500==    by 0x1264E2: main (in /usr/bin/procfetch)
==93500== 
==93500== 497,283 bytes in 3 blocks are indirectly lost in loss record 7 of 8
==93500==    at 0x4846FA3: operator new(unsigned long) (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==93500==    by 0x11EE60: std::__new_allocator<char>::allocate(unsigned long, void const*) (in /usr/bin/procfetch)
==93500==    by 0x11BA4A: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_S_allocate(std::allocator<char>&, unsigned long) (in /usr/bin/procfetch)
==93500==    by 0x11B951: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_create(unsigned long&, unsigned long) (in /usr/bin/procfetch)
==93500==    by 0x122341: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_mutate(unsigned long, unsigned long, char const*, unsigned long) (in /usr/bin/procfetch)
==93500==    by 0x120951: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::push_back(char) (in /usr/bin/procfetch)
==93500==    by 0x11E484: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator+=(char) (in /usr/bin/procfetch)
==93500==    by 0x11A499: Command::exec(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (in /usr/bin/procfetch)
==93500==    by 0x119E35: Command::exec_async(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::function<void (Command*)> const&)::{lambda()#1}::operator()() const (in /usr/bin/procfetch)
==93500==    by 0x1261B7: void std::__invoke_impl<void, Command::exec_async(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::function<void (Command*)> const&)::{lambda()#1}>(std::__invoke_other, Command::exec_async(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::function<void (Command*)> const&)::{lambda()#1}&&) (in /usr/bin/procfetch)
==93500==    by 0x126172: std::__invoke_result<Command::exec_async(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::function<void (Command*)> const&)::{lambda()#1}>::type std::__invoke<Command::exec_async(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::function<void (Command*)> const&)::{lambda()#1}>(Command::exec_async(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::function<void (Command*)> const&)::{lambda()#1}&&) (in /usr/bin/procfetch)
==93500==    by 0x126113: void std::thread::_Invoker<std::tuple<Command::exec_async(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::function<void (Command*)> const&)::{lambda()#1}> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) (in /usr/bin/procfetch)
==93500== 
==93500== 497,427 (144 direct, 497,283 indirect) bytes in 3 blocks are definitely lost in loss record 8 of 8
==93500==    at 0x4846FA3: operator new(unsigned long) (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==93500==    by 0x11A1F1: Command::exec(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (in /usr/bin/procfetch)
==93500==    by 0x119E35: Command::exec_async(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::function<void (Command*)> const&)::{lambda()#1}::operator()() const (in /usr/bin/procfetch)
==93500==    by 0x1261B7: void std::__invoke_impl<void, Command::exec_async(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::function<void (Command*)> const&)::{lambda()#1}>(std::__invoke_other, Command::exec_async(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::function<void (Command*)> const&)::{lambda()#1}&&) (in /usr/bin/procfetch)
==93500==    by 0x126172: std::__invoke_result<Command::exec_async(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::function<void (Command*)> const&)::{lambda()#1}>::type std::__invoke<Command::exec_async(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::function<void (Command*)> const&)::{lambda()#1}>(Command::exec_async(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::function<void (Command*)> const&)::{lambda()#1}&&) (in /usr/bin/procfetch)
==93500==    by 0x126113: void std::thread::_Invoker<std::tuple<Command::exec_async(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::function<void (Command*)> const&)::{lambda()#1}> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) (in /usr/bin/procfetch)
==93500==    by 0x1260E3: std::thread::_Invoker<std::tuple<Command::exec_async(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::function<void (Command*)> const&)::{lambda()#1}> >::operator()() (in /usr/bin/procfetch)
==93500==    by 0x12600F: std::thread::_State_impl<std::thread::_Invoker<std::tuple<Command::exec_async(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::function<void (Command*)> const&)::{lambda()#1}> > >::_M_run() (in /usr/bin/procfetch)
==93500==    by 0x495DBB3: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.33)
==93500==    by 0x4BB9A93: start_thread (pthread_create.c:447)
==93500==    by 0x4C46A33: clone (clone.S:100)
==93500== 
==93500== LEAK SUMMARY:
==93500==    definitely lost: 336 bytes in 7 blocks
==93500==    indirectly lost: 497,555 bytes in 5 blocks
==93500==      possibly lost: 0 bytes in 0 blocks
==93500==    still reachable: 0 bytes in 0 blocks
==93500==         suppressed: 0 bytes in 0 blocks
==93500== 
==93500== ERROR SUMMARY: 5 errors from 5 contexts (suppressed: 0 from 0)