内存泄漏G++ 11如果参数构建投掷

发布于 2025-01-31 14:37:31 字数 3879 浏览 2 评论 0原文

如果我用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

眉黛浅 2025-02-07 14:37:31

看来我已经遇到了此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...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文