c為什麼可以delete空指標,不可以delete野指

2021-03-26 02:27:02 字數 2632 閱讀 9912

1樓:

對於計算機程式設計而言,變數和物件在記憶體中的分配都是編譯器在編譯程式時安排好的,這帶來了極大的不便,如陣列必須大開小用,指標必須指向一個已經存在的變數或物件。對於不能確定需要佔用多少記憶體的情況,動態記憶體分配解決了這個問題。delete用法1.

刪除單變數地址空間int*a=newint;deletea;//釋放單個int的空間2.刪除陣列空間int*a=newint[5];deletea;//釋放int陣列空間使用注意事項1.new和delete都是內建的操作符,語言本身所固定了,無法重新定製,想要定製new和delete的行為,徒勞無功的行為。

2.動態分配失敗,則返回一個空指標(null),表示發生了異常,堆資源不足,分配失敗。3.

指標刪除與堆空間釋放。刪除一個指標p(deletep;)實際意思是刪除了p所指的目標(變數或物件等),釋放了它所佔的堆空間,而不是刪除p本身(指標p本身並沒有撤銷,它自己仍然存在,該指標所佔記憶體空間並未釋放),釋放堆空間後,p成了空指標。4.

記憶體洩漏(memoryleak)和重複釋放。new與delete是配對使用的,delete只能釋放堆空間。如果new返回的指標值丟失,則所分配的堆空間無法**,稱記憶體洩漏,同一空間重複釋放也是危險的,因為該空間可能已另分配,所以必須妥善儲存new返回的指標,以保證不發生記憶體洩漏,也必須保證不會重複釋放堆記憶體空間。

5.動態分配的變數或物件的生命期。我們也稱堆空間為自由空間(freestore),但必須記住釋放該物件所佔堆空間,並只能釋放一次,在函式內建立,而在函式外釋放,往往會出錯。

6.要訪問new所開闢的結構體空間,無法直接通過變數名進行,只能通過賦值的指標進行訪問。用new和delete可以動態開闢和撤銷地址空間。

在程式設計序時,若用完一個變數(一般是暫時儲存的資料),下次需要再用,但卻又想省去重新初始化的功夫,可以在每次開始使用時開闢一個空間,在用完後撤銷它。

2樓:匿名使用者

刪除空指標null是安全的,因為它什麼也沒做。

而野指標要麼指向已經被釋放的記憶體,那麼就會二次delete;要麼就是胡亂指向記憶體中的一塊,你知道那塊記憶體是用來幹什麼的呢?對其delete會發生未知的錯誤。

3樓:節子不哭

空指標也不可以delete啊,不信你試試,程式會致命性崩潰

c++ 中delete一指標後,該指標的是什麼?是 null 嗎?

4樓:

delete一個指標之後,只是**指標指向位置的空間,而指標本身的值不變。你需要手工將其賦值為null。

另外delete null的話不會有任何事情發生。

5樓:匿名使用者

不是 delete後就變成懸垂指標 就是沒有用的指標了最好自己將他指向null

如 delete p;

p = 0; // 0 == null

這樣就安全了。

否則會產生不必要的後遺症(在大型程式裡你就會懊惱了,當然這個我也不太懂了)

6樓:匿名使用者

這書我看過了 c++沉思錄 c++primer 上面都提到智慧指標 是這樣的:u_ptr這個類算是**類吧(有時叫它控制代碼類 其實我也不知道為什麼) 因為它有計數 計數的是有多少個物件是u_ptr類**的類(原始的) 每建立或者複製這種型別的物件 實際上在u_ptr中的計數加1(有多少個原始的類型別的物件指向u_ptr) 只有一個u_ptr指向原始的類(或是別的) 注意:當u_ptr中的計數為0時就是沒有物件對向他 所以執行delete p 而**類本身沒有動態申請堆空間 釋放的只是原始類(u_ptr指向的)申請的空間 我覺得你沒有弄清楚指標p和u_ptr之間的區別

會的!p成為野指標 如果在訪問p將出錯 因為p指向的記憶體空間以不在 但p還是指向原來的地方啊…

7樓:匿名使用者

c++ 中delete一指標後,該指標為野指標。其值不變,還是指向原來的單元,但若訪問這個單元,結果是無法預料的。

8樓:匿名使用者

delete刪除的只是該指標指向的記憶體,該指標變成一個野指標,需要重置為null。

9樓:匿名使用者

野指標,需要置null

c++中delete過後的指標居然還能用 如: int *p=new int(5); delete p; *p=6;這句應該報錯才對啊

10樓:匿名使用者

如果你對已經釋放了的記憶體進行讀寫操作,

那這個行為導致的結果是《未定義》的。

「未定義」就是說隨著程式的運**況而定,

有時候這次執行你去讀,

沒有問題,依舊能讀取東西出來;

但是下一次執行,未必能成功。

更嚴重的情況就是導致崩潰。

11樓:匿名使用者

因為 delete不會把指標變為空指標,指標還指向已經被刪除了的記憶體

12樓:匿名使用者

delete p,只是釋放了指標p的記憶體空間而已,又不是把p這個變數刪除了

13樓:匿名使用者

編譯執行本身不會報錯,地址是可寫的,只有其他語句操作此地址時,資料是錯的

C語言空指標,C語言中的空指標是什麼意思?

空指標是其值為null或0的指標,在下認為稱之為 指向 null或 指向 0的指標都是錯誤說法,因為若有int a,p a 則稱指標p指向了a,並不能說指標p指向了 a,只能說p的值是 a,不然就大錯特錯了。沒有指向 即沒有賦值 或指向的目標已銷燬了的指標稱為懸浮指標 可能人們據說的野指標也是它吧 ...

C 基類指標指向派生類指標時,指標可以用派生類的非虛方法嗎

需要知道一些常識,一個類所有的函式都是再code 區中唯一的存放一份。而資料成員則是每個物件儲存一份,並按照宣告順序依次存放。類a中有了虛擬函式就會再類的資料成員的最前面新增一個vfptr指標 void vfptr 這個指標用來指向一個vtable表 一個函式指標陣列 一個類只有一個該表 該表儲存著...

C盤已用空間比實際空間大,為什麼C盤已用空間比實際用的大

我覺得你在xp系統下顯示,肯定不行,比如某些檔案講自身影藏後xp根本顯示不了,類似這樣的軟體應該有的。萬一你是中了木馬,木馬隱藏了檔案,當然這個可能性不高,呵呵,木馬隱藏這麼龐大的檔案,估計也像是找死了。我建議你用pe來啟動,然後在pe裡面看看c盤有那些檔案,估計能找到10g。試試看吧 是不是 站佔...