【问题标题】:Why is this address 0xFFFFFFFF?为什么这个地址是 0xFFFFFFFF?
【发布时间】:2021-11-04 22:13:39
【问题描述】:

在我的 .h 文件中:

extern std::vector<bool*> selectedContainer;

inline void InitSprite(Sprite* sprite)
{
    bool* selected = new bool(false);
    sprite->onMouseHover = [&](){
        *selected = true;
    };
    sprite->onMouseNotHover = [&](){
        *selected = false;
    };
    selectedContainer.push_back(selected);
}

例如,如果传递的精灵的 onMouseHover 被调用。选择的指针始终为 0xFFFFFFFF。

【问题讨论】:

  • 您的 lambdas 应该按值捕获,而不是按引用捕获。
  • 非常感谢。为什么引用不起作用?
  • 因为它捕获了对selected的引用,当函数返回时该引用被销毁,所以引用变为悬空。
  • 通过引用捕获是可以的,只要 lambda 只是本地的并且不会转义。在这段代码中,lambdas 转义(因为它们被设置为外部对象)。
  • OT:指向 bool 的指针向量对我来说看起来很错误,为什么不只存储 bool 呢?喜欢std::vector&lt;bool*&gt; -> std::vector&lt;bool&gt;

标签: c++ memory lambda c++20


【解决方案1】:
[&](){

&amp; 表示 lambda 通过引用捕获其对象。

bool* selected = new bool(false);

这在自动范围内声明selected。这意味着当此函数返回 selected 时,会超出范围并被销毁。请注意,这意味着 指针 本身已被销毁,这与指针所指向的内容无关。

这个指针被 reference 捕获,所以在这个函数返回后,每当 lambda 引用捕获的对象时,它最终会引用一个被破坏的对象,因此是未定义的行为.

最简单的解决方案是让 lambdas 按 value 捕获对象(默认情况下):

[=](){

【讨论】:

  • 非常感谢。可悲的是我不能投票:(
  • @GeroB。我会为你:)
猜你喜欢
  • 2012-01-04
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 2020-09-30
  • 2010-09-13
  • 2020-01-04
  • 1970-01-01
相关资源
最近更新 更多