根据这个答案,我现在想知道lambda的生命周期是什么规则,以及与自动转换创建的函数指针的生命周期有什么关系.关于lambda的生命周期有几个问题(例如这里和这里),在这种情况下,答案是"它们的行为与你自己编写完整的仿函数对象完全一样",但是它们都没有解决转换为函数指针的问题.特殊情况.
我把这个小小的工作实例放在一起,说明了我的担忧:
#include <iostream>
typedef int (*func_t)(int);
// first case
func_t retFun1() {
static auto lambda = [](int) { return 1; };
// automatically converted to func_t
return lambda;
}
// second case
func_t retFun2() {
// no static
auto lambda = [](int) { return 2; };
// automatically converted to func_t and
// the local variable lambda reaches the end of its life
return lambda;
}
int main() {
const int a = …Run Code Online (Sandbox Code Playgroud) 多年来一直在做Java,所以一直没有跟踪C++.已经最后条款中增加了C++异常处理的语言定义是什么?
是否有一种模仿Java的尝试/终极的青睐成语?
我还担心C++没有可能抛出的所有可能异常的最终超类型 - 比如Java的Throwable类.
我可以写:
try {
// do something
} catch(...) {
// alas, can't examine the exception
// can only do cleanup code and perhaps rethrow, ala:
throw;
}
Run Code Online (Sandbox Code Playgroud)
附录编辑:
我最终接受了得票最多的答案,即使用析构函数进行清理.当然,从我自己的评论来看,很明显我并不完全同意这一点.但是,C++就是这样,所以在我想到的应用程序中,我会或多或少地努力坚持共同的社区实践.我将使用模板类来包装尚未具有类析构函数的资源(即C库资源),从而赋予它们析构函数语义.
新的附加编辑:
嗯,而不是最后一个封闭功能或许?结合ScopeGuard方法的闭包(参见下面的答案之一)将是一种通过任意操作完成清理并访问清理代码的外部范围上下文的方法.清理可以用在Ruby编程中看到的成语方式来完成,它们在打开资源时提供清理块.C++不考虑关闭功能吗?
问题很简单:当我编写lambda表达式时,C++编译器为我自动生成的仿函数对象的生命周期是什么?
我做了一个快速搜索,但找不到满意的答案.特别是,如果我在某处传递lambda,并在那里记住它,然后我就会超出范围,一旦我的lambda稍后调用并尝试访问我的堆栈分配但不再存活,捕获的变量会发生什么?或者编译器是否以某种方式阻止了这种情况?或者是什么?
继这个问题之后:可以通过参考传递一段时间吗?
我有一个固定的代码片段:
// global variable
std::thread worker_thread;
// Template function
template <typename Functor>
void start_work(const Functor &worker_fn) // lambda passed by const ref
{
worker_thread = std::thread([&](){
worker_fn();
});
}
Run Code Online (Sandbox Code Playgroud)
这被称为:
void do_work(int value)
{
printf("Hello from worker\r\n");
}
int main()
{
// This lambda is a temporary variable...
start_work([](int value){ do_work(value) });
}
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但我担心将临时lambda传递给线程构造函数,因为线程将运行,但函数start_work()将返回并且temp-lambda将超出范围.
但是我正在查看定义的std :: thread构造函数:
thread()noexcept; (1)(自C++ 11以来)
thread(thread && other)noexcept; (2)(自C++ 11起)
template <class Function,class ... Args> explicit thread(Function && f,Args && ... args); (3)(自C++ …
如果我有这样的功能
void check(char *buffer)
{
//some stuff that only needs to be run once
}
Run Code Online (Sandbox Code Playgroud)
在我调用一次后,有什么方法可以从内存中删除"删除"这个功能吗?
我可以轻松地在纯ASM中执行此操作.但我想知道是否有更标准的方法.