10

C++ 0x中的Lambda表達式/閉包如何使C++中的內存管理複雜化?爲什麼有些人說手動內存管理的語言中沒有封閉的地方?他們的主張是否有效?如果是,那麼背後的原因是什麼?Lambda表達式和內存管理

回答

10

Lambdas可以超越它們創建的上下文。通過引用綁定自由變量可能是一個問題,因爲當lambda想要稍後訪問它們時,它們可能不再存在。這只是「不要通過引用返回本地變量」。

15

這樣的論點是一個紅色的鯡魚。是的,lambda需要處理內存管理問題,但lambda基本上就像一個帶有成員變量的函數對象(函子)。無論函子需要處理什麼問題,lambda都必須處理。 C++ 0x lambdas有設施來決定要捕獲哪些對象以及它是按值還是按引用。這與在函數對象中存儲值和引用類似。

+1

我認爲它是_functor_或_function object_(而不是_functor object_),但是你有我的投票。 – sbi 2010-05-22 08:28:09

+0

謝謝@sbi。我修改它來說明我的意思。 – 2010-05-22 08:37:55

+0

問題在於lambda表達式在捕獲時不太明確,特別是如果您使用泛型「通過引用捕獲所有內容」形式:[&]。在構建仿函數時,必須明確地傳遞「捕獲」變量。但是,lambda是一個局部變量,不應該被允許像其他局部變量一樣被允許逃避它的範圍。 – 2010-12-01 18:09:51

2

C++ 0x中的Lambda表達式/閉包如何使C++中的內存管理變得複雜?

他們呢?它們只是用於創建函數對象的語法糖。沒有我們以前沒有見過的。直到現在,我們還有一個簡短的語法來創建這些動態的。

爲什麼有人說封閉式語言在手動內存管理中沒有地位?

你應該問問他們。我發現C++ 0x lambda方法相當優雅和低級。它符合C++的精神。

有沒有要求有效,如果是的話,背後的原因是什麼?

打我。謹慎自己挖掘一些論點?