如何解决带有 std::function 的“潜在内存泄漏”
考虑这个例子:
expect(
await findByLabelText($document,'Currently selected',{
exact: false,})
).toBeInTheDocument();
Demo(在最右边的标签上有一条完整的消息)
当使用 clang-tidy 检查此代码时,我收到以下警告:
#include <vector>
#include <string>
#include <functional>
#include <iostream>
using closure_type = std::function<void(void)>;
using closure_vec = std::vector<closure_type>;
class callbacks {
static closure_type common(std::string name,uint32_t number) {
return [number,name]() { std::cout << name << number << std::endl; };
}
public:
static closure_type foo(uint32_t number) { return common("foo ",number); }
static closure_type print(std::string msg) {
return [msg]() { std::cout << "print " << msg << std::endl; };
}
};
template <typename... calls_t> closure_vec wrap(uint32_t number,calls_t &&... calls) {
return closure_vec {
callbacks::foo(number),std::forward<calls_t>(calls)...,};
}
int main() {
auto vec = wrap(42,callbacks::print("hello,"),callbacks::print("world"));
for(auto &e: vec)
e();
return 0;
}
行号指向 warning: Potential memory leak [clang-analyzer-cplusplus.NewDeleteLeaks]
函数的作用域出口。
据我了解该消息,该工具担心 wrap
表的结果可能会丢失。但我不明白这怎么可能:callbacks::foo
是一个安全的类,应该在其析构函数中很好地销毁所有内容。而且它的生命周期也是由vector控制的,也是安全的。
这里发生了什么?如何解决此问题或解决方法?
不幸的是,我不能直接取消警告,因为这段代码分散在代码库中的任何地方。
解决方法
试试
closure_vec retval;
retval.reserve(sizeof...(calls)+1);
retval.push_back(callbacks::foo(number));
( retval.push_back(std::forward<calls_t>(calls)),... );
return retval;
这避免了 const initializer_list 包含您的代码创建的 std 函数的副本,因此也应该更高效。
我在这里尝试使用 C 样式数组,但尽管没有使用 std::initializer_list,我还是收到了警告。
这也有效:
std::array<closure_type,sizeof...(calls)+1> tmp ={
nullptr,std::forward<calls_t>(calls)...
};
tmp[0] = callbacks::foo(number);
return {std::make_move_iterator(std::begin(tmp)),std::make_move_iterator(std::end(tmp))};
问题出在初始化中的 callbacks::foo(number)
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。