下面的也能跑。结果还是“对”的。
闭包里保存引用和指针得万分小心
#include <iostream>
#include <memory>
#include <vector>
#include <functional>
class MyClass {
public:
MyClass(int i):m(i) {
std::cout << "----MyClass::MyClass() " << m << std::endl;
}
void member_function() {
std::cout << "****I am still alive! " << m << std::endl;
}
~MyClass() {
std::cout << "----MyClass::~MyClass() " << m << std::endl;
}
int m;
};
int main() {
std::vector<std::function<void()>> v_f;
int* p = new int[100];
{
for (auto& i : { 10}) {
MyClass my_class{i};
auto lambda = [&my_class,p,i]() {
my_class.member_function();
p[i] = i;
};
std::cout << i << " lambda name() = " << typeid(lambda).name() << std::endl;
std::cout << i << " lambda address() = " << &lambda << std::endl;
v_f.push_back(lambda);
}
}
std::cout << "******************" << std::endl;
delete[] p;
for (auto& task : v_f) {
task();
}
std::cout << p[10] << std::endl;
return 0;
}【 在 MyWorkLife 的大作中提到: 】
: 你这个例子正好说明问题
: 不像前面例子里面c++ lambda引用一个已经析构的空悬对象
: python对于保持对象生存周期毫无压力
: ...................
--
FROM 113.91.210.*