相关疑难解决方法(0)

与函数指针转换相关的lambda对象的生命周期

根据这个答案,我现在想知道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)

c++ lambda object-lifetime c++11

37
推荐指数
1
解决办法
2558
查看次数

在C++中模仿Java的try/finally是否有一个受欢迎的习惯用法?

多年来一直在做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++不考虑关闭功能吗?

c++ exception finally try-catch throwable

13
推荐指数
6
解决办法
3001
查看次数

在C++中,lambda派生的隐式仿函数的生命周期是多少?

问题很简单:当我编写lambda表达式时,C++编译器为我自动生成的仿函数对象的生命周期是什么?

我做了一个快速搜索,但找不到满意的答案.特别是,如果我在某处传递lambda,并在那里记住它,然后我就会超出范围,一旦我的lambda稍后调用并尝试访问我的堆栈分配但不再存活,捕获的变量会发生什么?或者编译器是否以某种方式阻止了这种情况?或者是什么?

c++ lambda

10
推荐指数
1
解决办法
1998
查看次数

将const引用传递给临时/匿名lambda到std :: thread构造函数是否安全?

继这个问题之后:可以通过参考传递一段时间吗?

我有一个固定的代码片段:

// 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++ …

c++ lambda pass-by-reference stdthread

7
推荐指数
1
解决办法
348
查看次数

C++删除函数

如果我有这样的功能

void check(char *buffer)
{
    //some stuff that only needs to be run once
}
Run Code Online (Sandbox Code Playgroud)

在我调用一次后,有什么方法可以从内存中删除"删除"这个功能吗?

我可以轻松地在纯ASM中执行此操作.但我想知道是否有更标准的方法.

c++ memory

-2
推荐指数
1
解决办法
101
查看次数