1樓:匿名使用者
那個指標的值是不變的,也就是還指向你申請來的那塊空間但是。即然delete了,那塊空間就不再規你的程式所有了,所以雖然你的那個指標還指向那塊記憶體空間
但你並不具有對那塊空間的使用權,訪問權。
所以當你在delete後如果試圖使用的話,程式就會崩潰所以最好賦上null,防止你寫程式時不小心引用導致錯誤
2樓:匿名使用者
指標只是儲存所指物件的位址,沒有任何狀態資訊。delete之後,本身指標的內容是不會改變的,只不過它裡面儲存的位址所對應的內存在系統裡標記為未使用的罷了。那段記憶體隨時可能分配給其它程序或者程序內的其它變數。
你應該避免使用delete後的記憶體,這是你的事。為了容易標識,所以才賦值為null。
c++ 中delete一指標後,該指標的是什麼?是 null 嗎?
3樓:
delete乙個指標之後,只是**指標指向位置的空間,而指標本身的值不變。你需要手工將其賦值為null。
另外delete null的話不會有任何事情發生。
4樓:匿名使用者
不是 delete後就變成懸垂指標 就是沒有用的指標了最好自己將他指向null
如 delete p;
p = 0; // 0 == null
這樣就安全了。
否則會產生不必要的後遺症(在大型程式裡你就會懊惱了,當然這個我也不太懂了)
5樓:匿名使用者
這書我看過了 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還是指向原來的地方啊…
6樓:匿名使用者
c++ 中delete一指標後,該指標為野指標。其值不變,還是指向原來的單元,但若訪問這個單元,結果是無法預料的。
7樓:匿名使用者
delete刪除的只是該指標指向的記憶體,該指標變成乙個野指標,需要重置為null。
8樓:匿名使用者
野指標,需要置null
c++中delete後賦null的問題
9樓:莫讓年華敷水流
new是跟系統借一塊記憶體,成功的話,系統給你一塊記憶體,並且系統會保證不會把你分配的記憶體給其他申請到
delete是跟系統還一塊記憶體,成功的話,系統會讓其他人可以分配到這塊記憶體
而new和delete的記憶體內容系統是不關心的,所以一般malloc後,都會初始化記憶體
釋放記憶體是沒有改變記憶體內容
指標是指向那塊記憶體,申請到了記憶體就會指向那塊記憶體,跟記憶體內容沒有關係
如: int* pint = new int;
pint = null; //這裡跟分配的記憶體沒關係,只是將pint這個指標指向null而已 (這裡由於沒有delete會記憶體洩漏)
10樓:匿名使用者
說的也是啊,析構之後ptr也會被銷毀的不需要置為null執行時發生什麼錯誤?
是不是你的c不是動態分配的…在你這裡delete ptr相當於delete c…
你把接受const char*的建構函式發來
11樓:心燈一豆
**沒貼全,目測是你**問題
delete null指標會發生什麼 5
12樓:
樓主你好!
c++標準規定,delete (void*)0;是安全的。
二現在的編譯器通常都會有乙個#define null 0的巨集所以,delete null也是安全的 無效操作;
當然,誰也不會給你0位址的記憶體,更不會允許你去釋放記憶體0位址的記憶體,因為那是作業系統管轄下的東西。在delete 這種操作的彙編碼裡邊,通常會有乙個校驗。如果需要釋放的空間是0位址,那麼不做任何操作直接返回
13樓:榮程路
什麼都不會發生。
delete 將會對指標進行檢查,當發現指標被指向null時將會跳過delete。
我們經常會發現類似這種**:
if (ptr != null)
明顯,這不是必要的。
但是我們最好在delete之後,將指標指向null,因為delete不會將指標指向null,而且對同乙個指標呼叫兩次delete,會導致意想不到的事情發生。更糟糕的是,多次delete會導致乙個你很難用debug去發現的乙個bug,且你的應用會表現的很奇怪。
所以,請總是使用以下語句
delete ptr;ptr = null
把指標賦值為null了,那麼該指標就什麼也不指向了。但是,你還可以對該指標重新賦值,讓它可以重新指向。
如果賦值為null,並且用delete進行銷毀了,那麼該指標就不能再重新進行指向了。如果需要,你得另外定義乙個指標了。
14樓:匿名使用者
我來告訴你:
把指標賦值為null了,那麼該指標就什麼也不指向了。但是,你還可以對該指標重新賦值,讓它可以重新指向。
如果賦值為null,並且用delete進行銷毀了,那麼該指標就不能再重新進行指向了。如果需要,你得另外定義乙個指標了。
回答完畢。
15樓:匿名使用者
delete操作的意思是**指標所指向的記憶體空間。而null表示這個指標沒有指向任何記憶體位址,所以delete 乙個值為null的指標,由於指標沒有指向任何位址,所以delete也就沒有**任何記憶體空間,即什麼也不會發生。
16樓:想把你忘了
null空指標 說明它存在 這個指標變數 delete後
再需要時 就要new了
17樓:匿名使用者
首先,delete是對指標的指向空間的釋放,不會改變指標的值,即指標不為null,把指標指向的空間釋放掉,但是指標的本身內容,即指向空間的位址,是不會改變的;指標為null時,沒有空間可釋放,也就不去釋放了,而指標依然有效,指標的內容依然是null,在指標的有效域結束時,指標本身所佔記憶體自動被釋放。
18樓:匿名使用者
delete是釋放記憶體的,你對指標進行delete只是釋放掉了指標所占有的記憶體空間,別的啥也不發生!
19樓:匿名使用者
//如果賦值為null,並且用delete進行銷毀了,那麼該指標就不能再重新進行指向了。如果需要,你得另外定義乙個指標了。
//不理解
int* p = 0;
delete p;
p = new int(100);
printf("%d\n",*p);
//這個**有什麼錯?
c++ 若指標指向的物件不存在了,指標是為空(null),還是指向的記憶體不可訪問了?
20樓:華仔橋
如果是你自己定義的指標變數,如果指向的物件不存在了,該指標就會成為野指標。如果是指向簡單變數時,讀出的資料是隨機的,寫操作可能會是程式core掉。如果指向的複雜的物件,例如:
class a
a* pa = new(a);
如果pa指向的物件不存在了,使用pa->a檢視或者賦值就會使程式core掉
21樓:匿名使用者
針對樓主的疑問,我自己親自測了下,
在linux下gcc版本4+把原物件delete,他的指標呼叫不涉及到記憶體的執行正常,涉及到記憶體的立馬崩潰.在mac os下gcc版本4.6.
1原物件delete且指標賦值為空,無論呼叫啥全部通過.將本地物件delete,賦值為空,呼叫涉及到記憶體才崩潰.所以懷疑mac系統對記憶體有保護機制.
正式回答樓主的問題:指向的物件不存在了,指標肯定不為空,他指向乙個位址,但是那塊位址裡存了什麼我們無法預估了.現在我對這種東西的做法是盡量使用單例,物件自己管理起來,一般情況物件是一直存在的,除非一開始都沒宣告起來.
22樓:匿名使用者
不可訪問
訪問的話會出現記憶體錯誤
23樓:匿名使用者
指標不為空,但訪問指向的記憶體時有可能出錯。
24樓:匿名使用者
delete 後,如果沒有顯式賦值為null,未必會是null
25樓:
訪問的話,會出現記憶體錯誤
c++中的delete到底是清空什麼?是指標本身還是指標所指向的值?
26樓:匿名使用者
c++的delete要執行兩個步驟:
1 按照指標型別,呼叫該類的析構函式。
(這個是c的free沒有的功能)。
2 根據指標型別,釋放相應寬度的記憶體空間。(類似c的free)。
從這個題目來說,delete是是否指標所指向的物件。而不是釋放指標本身。
一般而言,delete p;以後最後跟乙個 p=null;避免無效指標的二次訪問。
27樓:匿名使用者
主要是**記憶體,目的是為了告訴作業系統程式對這部分記憶體不在使用了 讓作業系統可以把這部分記憶體拿去做其它事情
28樓:
是清空記憶體,是指:指標指向的值的空間(記憶體),用於**記憶體
29樓:青檸
new 和 delete 是一組 new申請記憶體,delete釋放記憶體,記得將釋放的指標置為null
30樓:匿名使用者
指向的值,如果不用delete,指標本身沒了,但是所指向的空間沒有被釋放。
c++,為什麼可以delete空指標,不可以delete野指標
31樓:
對於計算機程式設計而言,變數和物件在記憶體中的分配都是編譯器在編譯程式時安排好的,這帶來了極大的不便,如陣列必須大開小用,指標必須指向乙個已經存在的變數或物件。對於不能確定需要占用多少記憶體的情況,動態記憶體分配解決了這個問題。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可以動態開闢和撤銷位址空間。
在程式設計序時,若用完乙個變數(一般是暫時儲存的資料),下次需要再用,但卻又想省去重新初始化的功夫,可以在每次開始使用時開闢乙個空間,在用完後撤銷它。
C語言中指標是什麼,C語言中指標的作用是什麼?
指標是c語言的難點,很難被學生接受。本部分主要演示 指標的定義,普通變數的定義,建立關聯,直接賦值,間接賦值。為了簡便,暫時只討論整形。設計 在組合框中選擇操作的型別,在彈出的對話方塊中做進一步的處理。二十個編輯模擬記憶體,十個為整形,十個為指標區.由於 記憶體 的限制,很容易 記憶體不足 二十個靜...
有關c 中指標,行指標和列指標應怎麼區分,請舉例 詳細說明應該怎樣運用
int a 10 b 5 5 int p1 a 這裡p1是你所說的列指bai針dup1 1指標指zhi向daoa 1 int p2 b 這裡p2相當於行指標,它指向的是數內組b 5 5 的首行b 0 p2 1使它容的指向加了一行,指向b 1 int p3 b 0 這個相當於p1指向的是一位陣列的b ...
C語言中刪除指標用啥,C語言中指標的作用是什麼?
include 包含的標頭檔案 char p char malloc 1024 在c中使用malloc分配 free p 用來釋放記憶體空間 另外分配記憶體還專可以 屬這樣寫 char p malloc sizeof p 一般用copydelete如下 舉個簡單的例子bai int pint new...