1. 程式人生 > >空懸指標、野指標、記憶體洩漏、記憶體溢位

空懸指標、野指標、記憶體洩漏、記憶體溢位

  在C語言中,指標的功能十分強大,這使得在C中程式設計師對於指標的使用要十分地謹慎。那麼首先我們對於指標的使用就是要對空懸指標(dangling pointer)和野指標進行避免。

  首先我們介紹空懸指標,空懸指標指的是一個指標,當它指向的物件已經被釋放的時候而自身卻沒有被置為null的時候,那麼這個指標就會變成一個空懸指標。而野指標,通俗的表示就是沒有進行初始化的指標,但是因為一個指標沒有初始化的時候會一通亂指,這個時候就類似於空懸指標了,所以有的介紹裡面將空懸指標作為野指標的一種來進行描述。實際上我們只需要明確一點:因為我們在動態申請記憶體並用指標進行指向該塊記憶體,在該記憶體被free/delete的時候僅僅是釋放了這塊申請的記憶體(注意一點釋放之後就是告訴系統這塊記憶體可以被其他地方申請到了),但是指標仍然指向這一塊記憶體,那麼如果我們後續使用到這個指標,但是這個指標仍然指向的是原來的記憶體地址,因為在釋放之後這塊記憶體地址就可以被其他的地方申請到了,那麼在有的時候就會發生災難性的後果,那麼這個時候我們需要的就是無論在初始化的時候還是在最後free/delete的時候都要將指標置為null,對於內建型別這些由編譯器進行回收記憶體的型別在生存期結束之後也要置為null(因為如果指向它的指標的生存期比該資料長的話依舊有概率出錯)。雖然說我們在初始化指標的時候也要將指標置為null,但那是在我們宣告一個指標卻沒有為其定義一個指向的物件的時候的做法。實際上當我們為其指明瞭一個指向的物件的時候就不用了。

  關於指標使用的一些注意事項,這裡主要介紹一些關於記憶體洩漏(memory leak)和記憶體溢位(out of memory)的:

  舉個很簡單的例子,記憶體洩漏指的是程式中有申請記憶體的過程,但在程式結束之後,始終沒有或者無法釋放佔有的記憶體的則稱為記憶體洩漏,單次的記憶體的洩漏可能使用者並不會察覺,但是累積的記憶體洩漏將會十分可怕,無論記憶體的大小,終會被耗光。也是因為我們在寫程式碼的時候記憶體洩漏的問題並不嚴重,因此基本上沒有表現出問題,而且現在的作業系統是不可能將全部的計算機記憶體都分配給IDE的,只會預先劃分一塊記憶體給IDE,這時候即使出現記憶體洩漏情況,也不會到影響整臺電腦的情況,所以一般小規模的記憶體洩漏也不會出現什麼大問題,但是作為一名程式設計師,在語言本身不提供記憶體回收機制的情況下知道及時釋放和回收記憶體是最基本的知識,所以必須要進行記憶體的釋放。

  知道了記憶體洩漏,知道記憶體溢位就變得簡單了許多,記憶體溢位就是可用的記憶體均被佔用,無法申請記憶體的情況。

相關推薦

指標指標記憶體洩漏記憶體溢位

  在C語言中,指標的功能十分強大,這使得在C中程式設計師對於指標的使用要十分地謹慎。那麼首先我們對於指標的使用就是要對空懸指標(dangling pointer)和野指標進行避免。   首先我們介紹空懸指標,空懸指標指的是一個指標,當它指向的物件已經被釋放的時候而自身卻沒

c語言記憶體管理指標malloc

C語言一共定義四個區塊:程式碼區、全域性變數和靜態變數區、棧、堆 針對四個區塊,使用者的記憶體分配也有三種不同的方式: 靜態變數區:在程式碼編譯的時候就分配好了,比如全域性變數,被static

(整合多篇文章)C++懸垂指標指標記憶體洩漏和垃圾回收機制

C++的記憶體回收機制 當我們使用new為一個物件分配了空間之後,在這個物件結束使用之後,我們必須人為的去釋放這塊記憶體(delete) Java的記憶體回收機制  當用new 建立一個Java物件時,它可以存活於作用域之外。所以在上述程式碼中,引用 str(

iOS開發時OC與C的混編中,strcpy導致的記憶體溢位指標

在最近的專案開發中,由於需要使用C語言的演算法供給OC專案呼叫,所以研究了一下OC與C的混編及.a庫的相關生成。而在混編的過程中,C語言的演算法都能正常呼叫了,但是被一個問題困擾了很長一段時間,就是在

GFlags 檢查記憶體越界指標等作用的工具使用

開啟檢查功能: gflags /p /enable  **.exe /full 關閉檢查功能: gflags /p /disable  **.exe 列出當前啟動了頁堆的程序列表 : gflags /p 1. 案例

指標辨析:懸垂指標指標指標智慧指標

原文地址:https://blog.csdn.net/zhaojinjia/article/details/8770989 懸垂指標:   1:提出的原因: 請看下面的程式碼片段:     int *p=NULL;

指標指標區別

空懸指標是:它曾經指向一個有效地址,但是現在不再指向有效地址,就是原來的那塊地址不能通過這個指標區訪問了。這通常是因為指標所指的記憶體單位被釋放了並且不再有效了。空懸指標存在並沒有什麼問題,除非你嘗試通過這個指標訪問指向的地址空間。不遺留任何懸空指標總是最好的實踐方式。野指標

4.指標指標

空懸指標:有一個指標指向一份動態記憶體,當我們delete這個指標後,這份記憶體就被釋放了,但是很多時候這個指標變數仍然儲存著這個記憶體的地址值,但是卻沒有了訪問這個記憶體的許可權。當我們使空懸指標去強行訪問記憶體的時候就會發生未定義的錯誤。如果我們需要在記憶體釋放之後仍然保

指標指標指標,賦值?

bug中最可怕的是野指標,那麼問題來了,野指標是什麼?是如何產生的?為什麼程式設計師會“忘記”? 昨天除錯時,我發現了一個野指標,由此我明白了。 a的值成了亂碼,而且gcc編譯器並沒有報錯,那麼請

C語言 指標指標

int *p1 = NULL;//空指標 int *p2;//野指標指向空的指標是空指標,指向一塊未知區域的指標是野指標例如  int *p = 0x123456;   這就是一個野指標,我們並不知道這

【C++進階】C++中的指標指標

歸根結底,程式中所使用的資料都需要從物理裝置上獲取,即程式中的資料需要從一個真實的實體地址中讀取或者寫入。所以當一個指標的邏輯地址可以通過計算能夠準確無誤的對映到一個正確的實體地址上時,這時候資料的訪問就是正確的,程式的執行也沒有任何問題。如果一個指標為空指標,那麼該指標所指向的邏輯地址空間位於空指標賦值分割

iOS 指標定位:指標嗅探器

一. 前言 最近最近被指派去解決一些線上的崩潰問題,經常遇到野指標導致的崩潰。相對於其他的原因引起的崩潰來說,野指標導致崩潰是最難定位的,這裡主要總結了兩種思路來定位野指標導致的崩潰。 二. 野指標 1.定義 當所指向的物件被釋放或者收回,但是對該指標沒有作任何的修

Android記憶體優化—記憶體洩漏記憶體抖動記憶體溢位

記憶體洩漏 當某些物件不再被程式所使用,但是這些物件仍然被某些物件所引用著,進而導致垃圾收集器不能及時釋放它們。 記憶體洩露 指由於疏忽或錯誤造成程式未能釋放已經不再使用的記憶體。 解決辦法:在不需要的時候及時釋放掉資源 記憶體抖動 記憶體抖動 指記憶體頻繁地分配和回

Leaks檢查記憶體洩漏記憶體清理監控的Android開發工具

MemoryMonitor 一個給開發者使用的Android App記憶體清理、監控工具,可以獲取當前手機的記憶體使用比率,可用記憶體大小,檢查一個APP是否存在記憶體洩漏。並且整理了一些優化記憶體的方式。 1.記憶體清理 類似360衛士的 加速球,獲取系統已用

徹底搞清c/c++中的幾個指標概念:懸垂指標和智慧指標以及啞指標指標

先看看下面兩段程式碼執行結果: #include<iostream> //#include <windows.h> using namespace std; int *p=NULL; void fun() {int i=10;p=&i;} v

tensorflow 記憶體洩漏記憶體不足

sess.graph.finalize() 把整個圖凍住,使圖變為只讀的形式,這樣就避免了問題的發生,但是這個函式不允許增加節點,在之後迴圈中tf.reshape()、tf.cast()函式等改變圖節點的函式也不能用了,也造成了一些不方便,這裡吐槽一下t

懸空指標指標有什麼區別?

       當所指向的物件被釋放或者收回,但是對該指標沒有作任何的修改,以至於該指標仍舊指向已經回收的記憶體地址,此情況下該指標便稱迷途指標。迷途指標經常出現在混雜使用malloc() 和 free() 庫呼叫: 當指標指向的記憶體釋放了,這時該指標就是迷途的。    

fork記憶體洩漏程序

1.系統呼叫  fork:複製程序 Pid_t  fork(void); Pid_t:int    pid:程序的編號(id識別符號) 父子程序併發執行 並行:一種特殊的併發,不是交替,我在執行的同時,你也在執行。兩個處理器 併發執行:一個處理器。在一段時間內交替執行,從長

C/C++指標之--NULL指標,零指標指標

經常在聽到野指標的時候一臉懵逼,現在是得好好總結一下了。感謝fly1988happy前輩,他的blog裡面還寫了一些關於空指標的保護政策,這些point等我對虛擬空間的訪問許可權進行總結時,再來探討。 1.空指標常量 0、0L、’\0’、3 - 3、0 *

如何避免記憶體洩漏溢位的幾種常用方法

儘早釋放無用物件的引用。 好的辦法是使用臨時變數的時候,讓引用變數在退出活動域後自動設定為null,暗示垃圾收集器來收集該物件,防止發生記憶體洩露。 程式進行字串處理時,儘量避免使用String,而應使用StringBuffer。 因為每一個String物