兩次free()或delete()同一個指針地址會怎麼樣。

#include "stdafx.h"
#include<iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	//cout<<"hello";
	//int *p=(int*)malloc(sizeof(int));
	//*p=1;
	//cout<<*p<<endl;
	//free(p);//free()之後相當於把內存清空(裏面存了一個很大的負數)並且還給了機器,使得機器可以將磁內存分給其他使用,
	//cout<<*p<<endl;
	//free(p);//如果再次free(),則編譯沒問題,運行時出錯(中斷)。
	int *x=new int[1];
	*x=1;
    cout<<*x<<endl;
	delete(x);//析構完之後葉清空了(裏面存了一個很大的負數),但是*x還可以用,野指針。
	//*x=2//這裏還可以用。但是這樣的話他可能就修改了不應該修改的值,因爲這個地址的內存可能已經分給其他的用了。
	cout<<*x<<endl;
	//delete(x);//再次delete(),則編譯沒問題,運行時出錯(響一下,然後程序就死了)。

	system("pause");
	return 0;
}

無論是free()還是delete().如果連續兩次free()或delete(),則程序在編譯時不會報錯,但是在運行時會報錯。

free(p):對應malloc(),一旦malloc()一塊內存,則相當於機器吧這塊內存借給你了,你可以隨便使用這塊內存,機器就不會再把這塊內存借給其他程序,所以其他程序就不會使用這塊內存。而一旦free()後,相當於你把這塊內存還給了機器,機器就可以把這塊內存借給其他程序了。free()相當於“還”,第一次free()時,這塊內存是被已經借出來給你了,你可以“還”,但是第二次free()時,這塊內存是屬於機器的,你拿着機器的內存還給機器,肯定會出錯(如果在兩次free()之間又有線程被分配了這塊地址,則應該不會報錯吧)。雖然你把這塊內存還給了機器,但是指針p還是指向了這個地址,要把他=null.否則就變成了野指針,他扔可以操作剛纔的地址,但是這個地址是不應該被沖走做的,如果操作可能就破壞了其他的使用這個內存的程序的數據。

delete():情況和free差不多,知識delete會調用析構函數,delete後,這塊內存被清空(裏面存了一個很大的負數),對於int來說還可以操作這塊地址,對於類來說就不知道了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章