【问题标题】:std::unique_ptr in lambda function causing segmentation faultlambda 函数中的 std::unique_ptr 导致分段错误
【发布时间】:2013-09-16 01:36:56
【问题描述】:

我有以下代码:

#include <functional>
#include <memory>
#include <string>
#include <iostream>

struct A{
    int i = 5;
};


class B{
    std::unique_ptr<A> a;
    std::function<void (void)> f;

    public:
    B(std::unique_ptr<A> a) 
        : a(std::move(a)), 
        f([&](){
                std::cout << a->i << '\n'; //segfaults when executing a->i
                })
    {}

    B()
        : a(new A),
        f([&](){
                std::cout << a->i << '\n'; //works fine 
                })
    {}

    void execLambda(){
        f();
    }

    void exec(){
       std::cout << a->i << '\n'; //works fine 
    }
};

int main(){

    B b1;
    b1.exec(); //works fine
    b1.execLambda(); //works fine

    B b2(std::unique_ptr<A>(new A));
    b2.exec(); //works fine
    b2.execLambda(); //will segfault
    return 0;

}

似乎当一个对象声明对现有 unique_ptr 的所有权并在 lambda 中使用该 unique_ptr 时,会发生分段错误。为什么在这种特定情况下会出现分段错误?无论如何在所有权已转移的 lambda 中使用 unique_ptr 吗?

非常感谢!

【问题讨论】:

  • 我猜我会说 lambda 正在从构造函数中捕获 a - 你从中移动的那个 - 而不是类中的那个。
  • 不要给所有东西取同一个名字? :-)
  • 乔纳森所说的,是特定的行为
  • @Jonathan:就是这样!我不敢相信我没有意识到这一点。非常感谢!

标签: c++ c++11 lambda segmentation-fault unique-ptr


【解决方案1】:

不要将成员和方法参数命名为同一个东西。但是,如果您坚持这样做,您应该能够将您的 lambda 捕获更改为 [this] 而不是 [&amp;] 以解决问题。

正如评论者所说:

我猜我会说 lambda 正在从构造函数中捕获 a - 你搬过来的那个 - 不是班里的那个。 ——乔纳森·波特

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多