内存泄漏G++ 11如果参数构建投掷
如果我用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++fs
valgrind
以及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实际上有1个泄漏。如果我使用clang
对完全相同的代码进行编译,则没有泄漏。我还尝试了 https://www.onlinegdb.com/ ,它也有泄漏。
谁能对这里发生的事情有更多的启示?这是GCC中的编译器错误还是我做错了什么?如果是我,是否有一种方法可以在编译时间检测到此类问题?
If I compile the following code with g++ (version 8.5.3 and also 11.2), memory leaks are shown, which I don't understand.
#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;
}
Nothing special for compiling the code:
$ g++ -fsanitize=address -Wall -Wextra -std=c++17 -g a.cpp -lstdc++fs
valgrind
as well as the GCC address sanitizer show:
$ ./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).
This is from GCC 11.2 wherease GCC 8.5.3 actually has 1 leaks more. If I compile the exact same code using clang
, there are no leaks. I also tried https://www.onlinegdb.com/ and it has the leaks as well.
Can anyone shed some more light on what's going on here? Is this a compiler bug in GCC or am I doing something wrong? If it is me, is there a way to detect such problems at compile time?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
看来我已经遇到了此GCC错误: https> https://gcc.gnu。 org/bugzilla/show_bug.cgi?id = 66139
我想升级到gcc 12.1是您的道路...
It seems I have run into this GCC bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66139
I guess upgrading to gcc 12.1 is the way to go...