#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來說還可以操作這塊地址,對於類來說就不知道了。