閉包之記憶體洩漏

2021-09-01 16:08:49 字數 935 閱讀 6721

對於全域性變數來說如果沒有主動銷毀則將永遠存在.即如果沒有主動的將其置為null,其始終會佔據一部分記憶體.

而對於函式內使用var宣告的區域性變數來說,當函式執行完畢後區域性變數會自行銷毀.

function f()

f()

而閉包的結構則可以改變變數的生存週期,使區域性變數不被銷毀

var cost = (function(num)else

}})()

cost(100);

cost(100);

console.log(cost()); // 200

console.log(cost()); // 200

上述**中區域性變數 money 在cost() 函式執行結束後,由於在返回的匿名函式中仍別引用,因此沒有被銷毀.由兩次列印cost()即可看出,改變量被儲存了下來,再次列印時仍可輸出.由此便造成了記憶體洩露,倘若不主動銷毀會一直占用記憶體資源.

而上述例項也恰恰利用閉包的該特點完成了乙個特殊的功能,cost()函式代表單次花費了多少,引數即為每次的花費值,而當我們想要獲取總共的花費值時只需列印 cost() 不傳入引數即可

要如何解決呢?

var cost = (function(num)finally

}else

}})()

cost(100);

cost(100);

console.log(cost()); // 200

console.log(cost()); // null

再看上述**利用finally的特性在cost()首次執行後主動將 money 銷毀,則再次列印結果為 null

QT之記憶體洩漏

以入門的hello world 為例 我們將 main.cpp 修改如下 include include intmain int argc,char ar 示例程式我們已經講解完畢。下面再說一點。我們可以將上面的程式改寫成下面的 嗎?include include intmain int argc,...

C 之記憶體洩漏篇

前段時間面試經常被問到記憶體洩漏。今天小總結一下 記憶體洩漏的發生是由於使用者在堆上分配了空間,但卻沒有釋放它。持續的記憶體洩漏最終將導致堆的耗盡,後繼的記憶體分配將會失敗。引發記憶體洩漏的原因是用new分配的記憶體沒有用delete釋放掉。如 可能在onpaint這樣的繪畫視窗的函式中分配了空間,...

Handler系列之記憶體洩漏

本篇簡單的講一下平常使用handler時造成記憶體洩漏的問題。什麼是記憶體洩漏?大白話講就是分配出去的記憶體,不回來。嚴重會導致記憶體不足oom。下面來看一下造成記憶體洩漏的 public class memoryleakactivity extends activity private class...