如果我用g++编译以下代码(版本8.5.3和11.2),就会显示内存泄漏,这一点我不明白。
#include <string>
#include <vector>
#include <filesystem>
#include <iostream>
auto getV() -> std::string {
return "string from function";
}
auto getP() -> std::filesystem::path {
throw std::string{"exception"};
}
auto getA( const std::vector<std::string>& p ) {
auto a = std::vector<std::string>{
"--t",
getV(),
"--a",
( getP() / "test" ).string(),
"--",
};
a.insert(a.end(), p.begin(), p.end());
return a;
}
auto main() -> int {
try {
getA({"v1", "v2"});
} catch ( const std::string& s ) {
std::cerr << "Caught: " << s << std::endl;
}
return 0;
}编译代码没有什么特别之处:
$ g++ -fsanitize=address -Wall -Wextra -std=c++17 -g a.cpp -lstdc++fsvalgrind以及GCC地址的消毒液显示:
$ ./a.out
Caught: exception
=================================================================
==13329==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 21 byte(s) in 1 object(s) allocated from:
#0 0x7f72e4591c17 in operator new(unsigned long) ../../../../gcc-11.2.0/libsanitizer/asan/asan_new_delete.cpp:99
#1 0x40505d in void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<char const*>(char const*, char const*, std::forward_iterator_tag) /opt/gnu/gcc/include/c++/11.2.0/bits/basic_string.tcc:219
#2 0x403ff9 in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<std::allocator<char> >(char const*, std::allocator<char> const&) /opt/gnu/gcc/include/c++/11.2.0/bits/basic_string.h:539
#3 0x402754 in getV[abi:cxx11]() /workspace/a.cpp:8
#4 0x402aa8 in getA(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&) /workspace/a.cpp:22
#5 0x403427 in main /workspace/a.cpp:30
#6 0x7f72e3818554 in __libc_start_main (/lib64/libc.so.6+0x22554)
Direct leak of 17 byte(s) in 1 object(s) allocated from:
#0 0x7f72e4591c17 in operator new(unsigned long) ../../../../gcc-11.2.0/libsanitizer/asan/asan_new_delete.cpp:99
#1 0x40505d in void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<char const*>(char const*, char const*, std::forward_iterator_tag) /opt/gnu/gcc/include/c++/11.2.0/bits/basic_string.tcc:219
#2 0x403ff9 in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<std::allocator<char> >(char const*, std::allocator<char> const&) /opt/gnu/gcc/include/c++/11.2.0/bits/basic_string.h:539
#3 0x402ad9 in getA(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&) /workspace/a.cpp:22
#4 0x403427 in main /workspace/a.cpp:30
#5 0x7f72e3818554 in __libc_start_main (/lib64/libc.so.6+0x22554)
SUMMARY: AddressSanitizer: 38 byte(s) leaked in 2 allocation(s).这是GCC 11.2写的,GCC 8.5.3其实有1000多个泄密。如果我使用clang编译完全相同的代码,就不会有泄漏。我也尝试过https://www.onlinegdb.com/,它也有漏洞。
有人能再弄清楚这是怎么回事吗?这是GCC的编译错误,还是我做错了什么?如果是我,是否有办法在编译时检测这些问题?
发布于 2022-05-24 08:52:13
我好像遇到了GCC的错误:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66139
我想升级到gcc 12.1是要走的路。
https://stackoverflow.com/questions/72359533
复制相似问题