C++ c++;-`从已销毁的函数对象返回后,此指针变为null

C++ c++;-`从已销毁的函数对象返回后,此指针变为null,c++,c++11,memory-management,g++,clang++,C++,C++11,Memory Management,G++,Clang++,下面的代码 #include <functional> #include <iostream> class State { void first_shot() { std::cout << "foo start " << this << std::endl; this->x = [=]() { std::cout << "baz

下面的代码

#include <functional>
#include <iostream>

class State {
    void first_shot()
    {
        std::cout << "foo start " << this << std::endl;
        this->x = [=]()
        {
            std::cout << "baz " << this << std::endl;
        };
        std::cout << "foo end " << this << std::endl;
    }
public:
    std::function<void()> x;

    State()
    {
        this->x = [=]()
        {
            std::cout << "bar start " << this << std::endl;
            this->first_shot();

            /* HERE */
            std::cout << "bar end " << this << std::endl;
        };
    }
};

int main()
{
    State s;
    s.x();
    s.x();
    return 0;
}
固定代码还可以,不是吗


顺便说一句,在我使用g++编译和运行它之前,二进制代码clangg++生成的运行没有任何问题,即使使用valgrind也不会出现内存错误。我不知道如何正确地做“正确”的事情(是正确的吗?)/P>当你正在执行它时,你正在改变<代码> x>代码>。当您从
first_shot
返回时,以前使用的
x
函数
lambda
已被删除。听起来像是未定义行为的诀窍。我认为更好的修复方法是减少代码的意大利面。@RSahu因为函数对象在上下文中只绑定
this
,那么具有
this
副本的修复方法是否合适?我看到函数对象被破坏了,但是函数执行(应该放在代码段中)不会失效,对吗?@RSahu是对的,我认为这与
这个
为空无关。事实是,在
this->first_shot()
完成后,控件返回到
this->x()
。除此之外,您重新输入的lambda中的点可能已消失,因为您已重新分配了
this->x
。如果它最终工作正常,那就意味着还没有任何东西覆盖了lambda所在的内存。对我来说,这听起来像是一个编译器错误。我认为lambda不应该绑定到
函数
对象。不过,我没有一份标准的副本可供检查。
this->x = [=]()
{
    State* me = this;
    std::cout << "bar start " << me << std::endl;
    me->first_shot();
    std::cout << "bar end " << me << std::endl;
};