加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – Clang生成可执行文件,泄漏内存,关于std :: function和lambd

发布时间:2020-12-16 05:19:06 所属栏目:百科 来源:网络整理
导读:Arch Linux(i686)上的Clang 3.2用于构建以下C 11代码 #include iostream#include functionaltypedef std::functionvoid () Action;typedef std::functionint () Generator;Action act(Generator const gen){ return [=]() { std::cout gen() std::endl; };}i
Arch Linux(i686)上的Clang 3.2用于构建以下C 11代码
#include <iostream>
#include <functional>

typedef std::function<void ()> Action;
typedef std::function<int ()> Generator;

Action act(Generator const& gen)
{
    return [=]()
    {
        std::cout << gen() << std::endl;
    };
}

int main()
{
    static Generator const gen([]() { return 0; });
    act(gen);
    return 0;
}

用clang test.cpp -std = c 0x&&& valgrind –leak-check = full –log-file = tmp.log.memcheck ./a.out然后我得到

==600== HEAP SUMMARY:
==600==     in use at exit: 1 bytes in 1 blocks
==600==   total heap usage: 3 allocs,2 frees,18 bytes allocated
==600== 
==600== 1 bytes in 1 blocks are definitely lost in loss record 1 of 1
==600==    at 0x402B124: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==600==    by 0x8048D4F: std::_Function_base::_Base_manager<main::$_1>::_M_clone(std::_Any_data&,std::_Any_data const&,std::integral_constant<bool,false>) (in /home/neuront/a.out)
==600==    by 0x8048C21: std::_Function_base::_Base_manager<main::$_1>::_M_manager(std::_Any_data&,std::_Manager_operation) (in /home/neuront/a.out)
==600==    by 0x8049455: std::function<int ()>::function(std::function<int ()> const&) (in /home/neuront/a.out)
==600==    by 0x8049283: std::function<int ()>::function(std::function<int ()> const&) (in /home/neuront/a.out)
==600==    by 0x80489B1: act(std::function<int ()> const&) (in /home/neuront/a.out)
==600==    by 0x8048A6C: main (in /home/neuront/a.out)
==600== 
==600== LEAK SUMMARY:
==600==    definitely lost: 1 bytes in 1 blocks
==600==    indirectly lost: 0 bytes in 0 blocks
==600==      possibly lost: 0 bytes in 0 blocks
==600==    still reachable: 0 bytes in 0 blocks
==600==         suppressed: 0 bytes in 0 blocks
==600== 
==600== For counts of detected and suppressed errors,rerun with: -v
==600== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

我不知道该代码是否有任何问题(并导致只有一个字节泄漏),但如果使用g 4.7编译,则不会有内存泄漏.有什么建议吗?

解决方法

分配在这里发生:
return [=]()

其中说“捕获不是值的参数”,包括“std :: cout”等,这意味着复制它们.

以下代码通过相同的编译& valgrind检查没有错误,但是请注意,程序员负责确保act的“gen”参数的生命周期长于lambda的生命周期.

#include <iostream>
#include <functional>

typedef std::function<void ()> Action;
typedef std::function<int ()> Generator;

Action act(Generator const& gen)
{
    return [&gen]()
    {
        std::cout << gen() << std::endl;
    };
}

int main()
{
    static Generator const gen([]() { return 0; });
    act(gen);
    return 0;
}

参见http://en.cppreference.com/w/cpp/language/lambda

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读