【问题标题】:Null pointer passed to lambda function is not null anymore [duplicate]传递给 lambda 函数的空指针不再为空 [重复]
【发布时间】:2017-07-07 01:26:17
【问题描述】:

我尝试传递一个空指针作为对 lambda 函数的引用,但它会接收一个内存地址而不是保持为空。

  function<void(json)> doTheThing(){
  ...
  pointer = nullptr;
  return [&](json object) {
    if(pointer != nullptr) {
       cout<<"pointer not null";
}
}

知道如何传递该指针以使其保持为空吗?

【问题讨论】:

  • pointer 在哪里声明?是 doTheThing() 本地的吗?
  • @NathanOliver,我相信 OP 将其称为 auto f = doTheThing(); f(); 在这种情况下 pointer 已经超出范围
  • @SingerOfTheFall 已经修改了评论。我们需要知道pointer 的声明位置。
  • 是的,指针是在doTheThing()中声明的;
  • 问题不在于您认为的位置。如果你知道问题在哪里,你就会解决它,所以你不会问这个问题,所以很明显,问题的存在正是因为你不知道问题在哪里。因此,请发布所有相关代码,而不仅仅是您认为问题所在的代码。

标签: c++ c++11 lambda rxcpp


【解决方案1】:

[&amp;] 表示通过引用隐式捕获。

如果您通过引用捕获某些内容,那么只要它存在,它就会保持在定义的状态。您似乎正在返回一个转换为 std::function 的 lambda。通过引用捕获是一个非常糟糕的主意。

局部变量超出范围。在 lambda 中捕获的对它的引用现在处于未定义状态,所有对它的使用都是未定义的行为。然后,您在 std::function 中返回此 lambda 的副本,调用它,鼻恶魔会射出您的鼻子;或者在您的情况下,指针不会显示为空。

永远不要在生命周期或副本生命周期超过当前范围的 lambda 中通过引用隐式捕获。

一般来说,永远不要在那种情况下隐式捕获东西,即使是[=]。明确。

std::function<void(json)> doTheThing() {
  void* pointer = nullptr;
  return [pointer](json object) {
    if(pointer != nullptr) {
      std::cout<<"pointer not null";
    }
  };
}

【讨论】:

  • 请不要对我上面的回答投赞成票;这是重复的。这个答案的存在只是为了向 OP 解释 OP 的特殊情况。而是跟随副本并在那里投票:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
  • 2013-09-07
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多