你这个例子正好说明问题
不像前面例子里面c++ lambda引用一个已经析构的空悬对象
python对于保持对象生存周期毫无压力
只不过三个lambda错误地binding到了最后一个ai对象而已
所以前两个ai析构了,最后一个在打印三个2之后才析构
【 在 VincentGe 的大作中提到: 】
: 标 题: Re: lambd表达式对已析构对象为啥不抛异常
: 发信站: 水木社区 (Sat Jan 27 11:52:45 2024), 站内
:
: 和gc无关,这个就是一个基本错误。在指针指向栈空间变量,但是它最后被回收,下面是一个Python等价示例。
:
: class A:
: def __init__(self, i):
: print(f"init {type(i)}")
: self.i = i
: def p(self):
: print('>>', self.i)
: def __del__(self):
: print('del', self)
:
: def main():
: a = []
: for i in range(3):
: ai = A(i)
: a.append(lambda : ai.p())
: for c in a:
: c()
:
: main()
:
: 【 在 MyWorkLife 的大作中提到: 】
: :
: : gc型语言转c++的一般会踩这个坑
: :
: : 【 在 Algoquant 的大作中提到: 】
: : : 标 题: lambd表达式对已析构对象为啥不抛异常
:
: #发自zSMTH@CDU.MP
: --
:
: ※ 来源:·水木社区
http://www.mysmth.net·[FROM: 117.23.183.*]
--
FROM 223.72.88.*