C 中的delete到底是清空什麼?是指標本身還是指標所指向的值

2021-03-26 02:27:01 字數 6284 閱讀 5566

1樓:匿名使用者

c++的delete要執行兩個步驟:

1 按照指標型別,呼叫該類的解構函式。

(這個是c的free沒有的功能)。

2 根據指標型別,釋放相應寬度的記憶體空間。(類似c的free)。

從這個題目來說,delete是是否指標所指向的物件。而不是釋放指標本身。

一般而言,delete p;以後最後跟一個 p=null;避免無效指標的二次訪問。

2樓:匿名使用者

主要是**記憶體,目的是為了告訴作業系統程式對這部分記憶體不在使用了 讓作業系統可以把這部分記憶體拿去做其它事情

3樓:

是清空記憶體,是指:指標指向的值的空間(記憶體),用於**記憶體

4樓:青檸

new 和 delete 是一組 new申請記憶體,delete釋放記憶體,記得將釋放的指標置為null

5樓:匿名使用者

指向的值,如果不用delete,指標本身沒了,但是所指向的空間沒有被釋放。

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

6樓:

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

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

7樓:匿名使用者

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

如 delete p;

p = 0; // 0 == null

這樣就安全了。

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

8樓:匿名使用者

這書我看過了 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還是指向原來的地方啊…

9樓:匿名使用者

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

10樓:匿名使用者

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

11樓:匿名使用者

野指標,需要置null

在c++中,指標被delete後而不賦值為null,那該指標是什麼樣的狀態,它有指向的記憶體空間嗎?

12樓:匿名使用者

那個指標的值是不變的,也就是還指向你申請來的那塊空間但是。即然delete了,那塊空間就不再規你的程式所有了,所以雖然你的那個指標還指向那塊記憶體空間

但你並不具有對那塊空間的使用權,訪問權。

所以當你在delete後如果試圖使用的話,程式就會崩潰所以最好賦上null,防止你寫程式時不小心引用導致錯誤

13樓:匿名使用者

指標只是儲存所指物件的地址,沒有任何狀態資訊。delete之後,本身指標的內容是不會改變的,只不過它裡面儲存的地址所對應的記憶體在系統裡標記為未使用的罷了。那段記憶體隨時可能分配給其它程序或者程序內的其它變數。

你應該避免使用delete後的記憶體,這是你的事。為了容易標識,所以才賦值為null。

c++delete物件指標的時候,指標的值會改變嗎?指標指向的物件內容會改變嗎?

14樓:歡樂三重谷

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

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

c++中的delete的操作到底是怎麼回事??

15樓:匿名使用者

00399208 代表的是抄p這個指標指向的地址值,在delete之前輸出的那個5代表p這個指標指向的一個int空間裡面存放的數值;

在你delete之後,p這個指標沒有變化,仍然是00399208,但是它指向的空間已經被釋放了,所以輸出的就是一個「不確定」的數值:-57266307.

對於問題的補充:

2.如果在程式**後面再加上*p=5;cout<<*p<

可以再輸出一個5;注意已經使用了delete操作。

空間雖然釋放了,但那時p這個指標仍然是有效的,它指向的記憶體仍然是可寫的,所以程式會進行正確的輸出。

16樓:何處淬吳鉤

p是個指bai針,int *p=new int(5)使p指向新申請的du具有5個元素的整型陣列這zhi段內dao存,回用delete刪除後,這段記憶體已經被**答,而p沒有改變,仍指向這段記憶體,所以*p是個不確定的值。

1.*p不是一個不確定的值,執行結果總是-572662307。

這是因為p指向的記憶體是固定的,但這段記憶體並未被本程式使用,因此可能被作業系統分配給其他程式,若該段記憶體沒有被分配,則記憶體中的資料是不變的,也就是*p是固定的,另外,不同的編譯器也有不同的約定,有的編譯器會對不屬於本程式的記憶體固定的顯示一個錯誤值。

2.如果在程式**後面再加上*p=5;cout<<*p<

這等於為*p申請了記憶體,存放整型資料5,*p當然=5.

17樓:哀傷落葉

1.指標

baip裡的地址肯定是固定的.

這是因du為程式使用的內zhi存可分成4個部分dao(**區

版,靜態全域性變數區,棧區,堆區),你這裡是

權動態分配記憶體,使用的是堆區,堆裡面的可用空間不是連續的,系統裡面儲存了一個連結串列來放這些可用空間的地址,而你申請記憶體時,系統會從表頭開始檢索,遇到第一個滿足要求的,就把這個地址給你.

你在執行程式時系統找到那個地址給你,結束執行後你那塊記憶體又被還回去了

(delete p),你第二次在執行這個程式,系統還是那樣找,找到的當然還是那個地址.

2.這個結果是對的,但這麼做不好, 你最好在delete p;後加一句

p = null;然後就不要用p 了,我在說下為什麼會出現5

你 delete p;是釋放了p指向的那片記憶體,那麼p指向的內容就不確定了,而p 依然是一個指向int 的指標

而 *p = 5 是讓p指向字面常量5 的地址,5這個常量是直接存放在**區的,

所以之後你不能改變*p的值

18樓:

delete 是釋放new 操作佔用的記憶體,一般new 和delete 是連用的,不釋放記憶體會造成記憶體洩漏,釋放記憶體後 p就是一個無效指標,不能在其上做任何操作

19樓:匿名使用者

這樣操作是危險的!!delete 釋放掉new的空間,所以p所指的內容就釋放掉了。所以 *p是未知的!!!但p本身存放的東西沒有變,要到程式結束時被釋放

c++中delete之後的再new問題

20樓:

作為指標型簡單變數使用刪不刪,都可以用,就等於已宣告瞭:

int *p;

指標本身已有儲存單版元。

new int; 是給它分配存權

放指向數值的單元。

delete 只刪了 存放指向數值的單元。

指標本身單元還在。只要它的使用符合語法,仍然可用。例如:

a = 2;b=3;

p = &a; printf("%d\n",*p);

p = &b; printf("%d\n",*p);

-----------------------int *p=new int;

*p=1;

delete p;

*p=2;

不發生錯誤因為程式較小,指向的數值單元裡的值尚未發生變化,單元也未重新分配另作它用。

養成習慣,程式設計時要儘量避免這種用法。

21樓:匿名使用者

分配空間是指bai

從程式可用的堆du空間裡取出zhi

合適大小的dao空間,並將這個空間內

的地址付給指容

針p. 在顯示的釋放前,這片記憶體不會被分配給其他指標。

delete完成兩個動作:1,清空ptr指向的記憶體(對於類物件指標,就是呼叫其解構函式)。2,告訴系統這快記憶體現在沒有被引用,可以被分配給其他的申請者。

上面的程式中,delete p後, p指向記憶體的值被清空,也就是*p是一個未被初始化的整型變數。指標p的值並未被改改變,指標p仍然指向這片記憶體。因此,*p=2; 仍然可以執行。

可能的問題是,某次呼叫int *p2 = new int時,系統會把這片記憶體視為可分配的記憶體而分配給p2,那麼 p2與p指向同一片記憶體, 而產生不可預計的程式邏輯。

22樓:蘋果味の麵包

delete後

p = null;的操作是bai

很必要的。

delete的p俗稱野指標du,指向zhi了未知內容。dao這段記憶體可能為其他資料版所用。

一般來說,權這段記憶體被其他操作改寫的可能性並不大,因此會正確顯示。但是是絕對的危險操作。

每年世界上都要花20億美元解決野指標引起的bug,尤其對長期執行的程式,危害極大。

23樓:選擇郵箱

delete之後的再bainew絕對是必須的你寫的程du

序很zhi小,p的地址空間dao可能一直未被專佔用,但當一臺電腦有屬大量程式執行時,不能確定作業系統會分配哪段記憶體,如果在你delete p之後,p的空間被佔用,而你此時在向p進行賦值便會導致程式崩潰

c/c++中指標本身的值和指標指向的值有什麼區別?

24樓:匿名使用者

指標本身pa的值是一個變數的地址&a,而指標pa指向的值是變數a的值,不知道說清楚沒有。

25樓:極天異雲

1.指標本身是一抄個變數,存放的值襲是32位的無符號整數,這個整數是一個32位的地址。

2.通過這個32位的整數地址值,可以找到另外一個資料,就是這個指標指向的資料了,可以是任何了型別的資料。也就是指標指向的值了。

26樓:匿名使用者

指標本身的值是一個地址

指向的值是該地址裡面儲存的值

指標本身的值也是儲存在一個地址中的

27樓:南坪中學校帥

指標本身的值是指標指向值的首地址

char *p="123456"

p指向的是"123456"的首地址 也就是"1"的地址.

28樓:

指標的值是指 指標存放的變數的地址。

指標並不指向什麼什麼的值。

29樓:匿名使用者

指標本身的值是它所指向的變數在記憶體中的地址 。指標指向的是你的資料或者操作。

30樓:匿名使用者

指標本身的值是它所指向的變數在記憶體中的地址

c++中delete字元只是釋放記憶體而不會對該地址儲存的值進行修改嗎?

31樓:匿名使用者

你這描述誰有耐心看啊,累死個勁。

不明白你到底什麼意思,不過你這**寫的就沒什麼內意義也不標準。

一是容指標delete後沒有賦null,那麼其實他還是指向那塊記憶體的,只是編譯器不給於它專屬的保護了,說不定什麼時候就給強徵了。

二是,直接cout<

32樓:潮汕瓜

會,delete後一般把該指標變數賦值為0,且對應空間儲存的變為隨機值

c++ 中new 和delete 指向分配的記憶體的指標的值在delete之前是否可變?

33樓:匿名使用者

delete不關心0,記憶體釋放都是整塊申請,整塊釋放,不會只釋放一部分

c中delete一指標後,該指標的是什麼 是NULL嗎

delete一個指標之後,只是 指標指向位置的空間,而指標本身的值不變。你需要手工將其賦值為null。另外delete null的話不會有任何事情發生。不是 delete後就變成懸垂指標 就是沒有用的指標了最好自己將他指向null 如 delete p p 0 0 null 這樣就安全了。否則會產生...

陽曆陰曆到底是什

陽曆1993年1月4日是魔羯座 陽曆12月23日 1月20日 星座是按陽曆的出生日期劃分的 陽曆1月4日是 摩羯座 12月22日 01月19日 1993年1月4日出生的農曆生日多少 公曆 公元1993年01月04日 農曆 農曆12月12日 星期一 魔羯座 歲次 壬申年 生肖屬猴 壬子月 乙酉日 農曆...

人生的意義到底是啥麼呢人生的意義到底是什麼

人生的意義是 為人類,為社會做出貢獻,不要求轟轟烈烈而名留青史 只要有。求採納 人生的意義就是 我 我 的存在就是人生的意義!為了 我 活著,更好的活著,就是人生意義的體現!這個 我 對於每個人來說,就是每個人自己!千萬別去尋死,哥們,活著就是希望!人生的意義,要是你嚮往和探尋著人生的某種意義,這說...