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;
};