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)
解决方法
分配在这里发生:
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; }
原文地址:https://www.jb51.cc/c/114934.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。