關於動態記憶體申請的指標該如何釋放?
示例程式碼
#include<stdio.h> #include<stdlib.h> char* ToBin(int num) { int flag=1; char* result=(char*)malloc(sizeof(char)*33); //函式內動態申請記憶體,函式呼叫結束後該地址的內容不會被釋放 int i; for(int i=31;i>=0;i--) { if(num & flag) { result[i]='1'; } else { result[i]='0'; } flag<<=1; } result[32]='\0'; return result; } int main() { int a1=28; int a2=-28; char* a; int i=0; printf("%s","I am CDQ!\n\0"); a = ToBin(a1); //此時result指標被釋放掉,指標a指向了動態記憶體 //a= ToBin(a2); printf("a1:"); for(int i=0;i<33;i++) { printf("%c",a[i]); } printf("%c",'\n'); free(a); //該記憶體使用完後可以被釋放了,不然會一直佔用記憶體 a = NULL; return 0; }
======================================
百度知道
問:兩個指標指向同一個new開闢的空間,當釋放其中一個指標後,為什麼另一個指標還能操作這個空間?
我在一個函式裡開闢了一個空間,然後用指標b指向這段空間,再返回給main函式,用指標b接收,再讓指標c也指向這段空間,然後我釋放了b指向的這段空間(那不也是c指向的空間嗎?)為什麼釋放後,c還能去操作這段空間。(delete不是釋放new開闢的空間嗎?要是空間被釋放了,那所有指向這段空間的指標不是應該都不能再操作這段空間了嗎?)
在我理解中,delete是釋放一個空間,不管多少個指標指向,只要以其中一個指標為載體,釋放這空間後,其他指向這空間的指標就沒有許可權操作這空間了。
答:
1,C/C++沒有授權這個概念,C語言(含C++)之所以稱為程式bai員的語言就是說,作為程式設計師的你,許可權是最大的,你可以做任何事情.訪問權的管理是程式設計師的事情,就如同陣列邊界檢查工作同樣是程式設計師的事
2,new只不過程式向系統申請一塊可用記憶體,而系統會檢索登錄檔(不是windows登錄檔)通過已佔用記憶體計算出一塊未被佔用的且可以容納申請長度的記憶體給程式,並且標記這塊記憶體已佔用,然後返回首地址,這個機制只不過防止記憶體重複分配,避免資料被其他程式覆蓋掉,但是讀寫是開放的.
3,通過指標DELETE,就是告知系統這個指標指向的地址空間我不要了,而系統做的事情僅僅是刪掉這個註冊記錄,那麼這個地址的空間下次可以再分配了,也就是回收了,但是內容不需要清掉,清理掉多此一舉,太浪費CPU時間了,因為下次分配時程式會用資料或者通過初始化覆蓋掉廢棄的資料.
因此當一個指標釋放後,你的程式的其他指標還是指向原地址,而這塊地址沒被其他程式佔用時,裡面的資料還在,因此用其他指標訪問它還是可以的,但是萬一,在你釋放後,多工系統下,其他程序的執行緒馬上申請了這塊記憶體,那你程式讀出的資料可能變化了,但是寫的話就會干擾主權程式的執行.從而可能會導致系統奔潰.