本文摘自:
xcode 視窗並顯示出問題的**,這是非常棒的功能。
在本例中,第一次 nsstring 分配的時候出現了洩露,你需要做一些處理。這是個非常簡單的例子,但找到為什麼會發生洩露則要麻煩些。讓我們仔細看一下例子。在 viewdidload 當中,我們為字串分配到了記憶體,如下所示:
mmyleakystring = [[nsstring alloc] initwithutf8string:」i』m a leaky string.」];
在 dealloc 當中我們用如下方式來釋放
[mmyleakystring release];
你的直覺可能是這樣不會發生洩露,但搜尋**中所有用到了 mmyleakystring 的地方,在 dosomethingnow 中,它是這樣用的:
mmyleakystring = [[nsstring alloc] initwithutf8string:
「look, another alloc, but no release for first one!」];
注意,我們宣告了乙個新的字串,並且將 mmyleakystring 指向了它。這裡的問題是我們沒有在更改 mmyleakystring 的指向前釋放它原 來指向的記憶體。所以原始的字串依然在堆中,並且我們沒有辦法釋放這部分記憶體。dealloc 裡的 release 操作實際釋放的是我們在 dosomethingnow 中宣告的字串所佔記憶體,因為這才是指標所指。
為了修復這個問題,我們可以把 dosomethingnow 改成下邊的**:
- (void) dosomethingnow
這段**做的是在我們指定 mmyleakystring 到新的字串前釋放第乙個字串所佔記憶體。重新編譯執行程式,你會看到只有乙個記憶體洩露。當然,在專案中可能有更好的方式來處理 nsstring,但如果你這樣處理的話可以修復這個洩露問題。
讓我們看看第二個洩露問題。單擊洩露提示看什麼導致了記憶體洩露。發現這個洩露來自於 leakyclass::leakyclass() 建構函式:
在呼叫堆疊中雙擊它,出問題的**將會再次出現在 xcode 中。
我們看到在建構函式裡宣告了乙個新的 leakedobject 物件,但是析構函式沒有刪除,這樣不好。對於每乙個 new 操作,都需要有與之對應的 delete 操作。所以我們把析構函式改變成下邊的樣子:
leakyclass::~leakyclass()
}重新編譯執行,沒有記憶體洩露了!
我選擇這兩個例子,雖然非常簡單,但他們展示了 instruments 可以用來追蹤 object-c 和 c++ 中的記憶體洩露。
修復你的記憶體洩露問題吧,記住,沒有記憶體洩露的程式才是乙個好程式。
原文出處
alibaba easyexcel 工具的使用
匯入 easyexcel 依賴 com.alibabagroupid easyexcelartifactid 2.1.2version dependency 讀取 excel 檔案 model 建立實體類 student data public class student 建立 student 的 ...
Zmap Zgrab massdns工具的使用總結
他是一款網路掃瞄工具,據說可以在40分鐘內掃瞄整個ipv4的位址空間,我們可以用它來快速發現開啟對應埠的ip,這的確非常方便,因為速度特別快。用於發現埠為443的ip指令 sudo zmap w top 1m a only ip.csv p 443 b 100m o top 1m a open 44...
linux sendEmail工具的安裝使用
1 sendemail的主頁 2 安裝 tar zxvf sendemail v1.56.tar.gz cd sendemail v1.56 cp sendemail usr local bin 3 然後給確認確實它具有執行許可權 ll usr local bin sendemail rwxr xr...