C++ 为什么这段代码涉及a类内存泄漏中的静态lambda?

C++ 为什么这段代码涉及a类内存泄漏中的静态lambda?,c++,memory-leaks,C++,Memory Leaks,我最近遇到了这段代码。Valgrind说有内存泄漏,但我不知道为什么: #include <iostream> #include <set> #include <map> #include <memory> class Player { public: Player() { static auto foo = [this]() { nums_.insert(0); };

我最近遇到了这段代码。Valgrind说有内存泄漏,但我不知道为什么:

#include <iostream>
#include <set>
#include <map>
#include <memory>
 
class Player {
public:
    Player() {
        static auto foo = [this]() {
            nums_.insert(0);
        };
        foo();
    }
private:
    std::set<int> nums_;
};
 
int main() {
    std::map<std::string, std::shared_ptr<Player>> players;
    players.insert({"eenz", std::make_shared<Player>()});
    players.erase("eenz");
    players.insert({"eenz", std::make_shared<Player>()});
}
#包括
#包括
#包括
#包括
职业选手{
公众:
玩家(){
静态自动foo=[this](){
插入数值(0);
};
foo();
}
私人:
标准::设置nums;
};
int main(){
地图播放器;
insert({“eenz”,std::make_shared()});
玩家。擦除(“eenz”);
insert({“eenz”,std::make_shared()});
}

当我从lambda中删除
static
时,内存泄漏消失。我试图找出这是内存泄漏的原因,但我没有运气。有人知道这是内存泄漏的原因吗?

Valgrind只告诉您内存已分配但未释放,这并不一定意味着内存已泄漏,只是没有删除是的,但是你的lambda会一直作用于你创建的第一个对象,这可能不是你想要的,特别是如果第一个对象被删除的话。我认为lambda只作用于我们创建的第一个对象,但是我有点困惑,因为这个片段:,它的行为类似于lambda对所有创建的对象进行操作。我不认为该代码段的行为类似于lambda对每个对象进行操作。事实上,如果你打印出每个
Player
对象的
nums\uu
大小,我想你会看到第一个对象的大小是4,而其余的是0。在任何情况下,这个片段对我来说都有点可疑。我不完全清楚它想展示什么。啊,明白了,谢谢!!