c語言mallocfree
1. c語言,請問為什麼子函數中數組malloc會被free掉,但是結構體不會
你說的對,如果形參非要用指針的話,是需要二重指針才能實現。
你的createList的形參是int a[],等價於int *a。a是形參,是局部變數,只改變局部變數的值,在函數退出時它的值就無效了。下面的代碼就是把局部變數a的值賦了malloc分配的地址,而這並不能影響到main函數中傳遞的實參a。
如果一定要用指針來實現這個功能,就在main函數中調用createList處傳入a的地址,即createList(&a),函數定義改為int createList(int **a),然後下面函數體中的a都修改為(*a),這樣就修改了*a指向的地址保存的內容,相當於修改了實參a的值。
這個結構體能帶回值,是因為你的函數定義createList(Slist &a)形參使用了引用&,C++中的引用可以很方便地做到修改形參的同時修改實參。
另外,C++語言建議盡量避免使用malloc手動去申請內存,因為在復雜條件下很容易沒有正確free,導致內存泄漏。建議使用vector容器去保存數組,函數定義使用(vector<int> &a)引用就可以輕松修改實參。
2. 在C語言中malloc,free,new,del,
1,malloc與free是C++/C語言的標准庫函數,new/delete是C++的運算符。它們都可用於申請動態內存和釋放內存。
2, 對於非內部數據類型的對象而言,光用maloc/free無法滿足動態對象的要求。對象在創建的同時要自動執行構造函數,對象在消亡之前要自動執行析構函數。由於malloc/free是庫函數而不是運算符,不在編譯器控制許可權之內,不能夠把執行構造函數和析構函數的任務強加於malloc/free。
3,因此C++語言需要一個能完成動態內存分配和初始化工作的運算符new,以一個能完成清理與釋放內存工作的運算符delete。注意new/delete不是庫函數。
4,C++程序經常要調用C函數,而C程序只能用malloc/free管理動態內存
new 是個操作符,和什麼"+","-","="...有一樣的地位
簡單的說:
malloc,free是c的函數,new,delete是c++的運算符
此外,new是強制類型的,malloc不是,需要類型轉換
當然還有很多不同
new 可以調用構造函數在聲明的時候初始化
malloc只是分配空間,需要在其他地方初始化
而delete不僅會釋放空間,在釋放前會調用析構函數
而且malloc需要指定分配空間大小, 而new是自動計算的
3. c語言中,malloc和free是什麼意思
屬於內存管理的兩個函數,malloc是申請內存的,free是釋放內存的。
1、malloc一般用法:
int *t=NULL;
t=(int *)malloc(sizeof(int));
也可以在sizeof前面加上一個'n*'這就成了一個動態分配數組的方法。
2、free一般用法:
int *t=NULL;
t=(int *)malloc(sizeof(int));
free(t);
這樣t所指的空間就被釋放掉了。
(3)c語言mallocfree擴展閱讀:
malloc函數定義
其函數原型為void *malloc(unsigned int size);其作用是在內存的動態存儲區中分配一個長度為size的連續空間。此函數的返回值是分配區域的起始地址,或者說,此函數是一個指針型函數,返回的指針指向該分配域的開頭位置。
如果分配成功則返回指向被分配內存的指針(此存儲區中的初始值不確定),否則返回空指針NULL。當內存不再使用時,應使用free()函數將內存塊釋放。
4. C語言-動態分配內存 malloc & free
需要用一個數組來保存用戶的輸入,但是卻不知道用戶會輸入多少條數據。
(1) 如果設一個太大的數組,則顯得浪費內存
(2) 如果設得太小,又怕不夠
問題:如何做到恰好夠用、又一點不浪費呢?
系統中存在一個內存管理器(MM, Memory Manager),它負責管理一堆閑置內存。它被設計用於解決此類問題。
MM提供的服務:應用程序可以向MM申請(借出)一塊指定大小的內存,用完之後再釋放(還回)。
應用程序在使用malloc時,要把返回值轉換成目標類型。
這塊內存和數組沒有本質區別,用法完全相同。
需要先計算需要多少位元組的內存空間
數組舉例子:
釋放的時候需要注意, 因為在for循環執行之後,p的地址往前移動了10, 所以需要減去10, 然後再釋放p,不然會有問題
// 當銷毀時只需要free一次,malloc了幾個位元組就會free幾個位元組,和char類型還是int類型無關
free(p);
在一個函數中動態分配的內存,在另一個函數中操作這塊內存
(1) MM是一個系統級的東西,所有的應用程序都向同一個MM申請內存。
(2) 何為借出?實際上,在內存被借出時,MM只是把它管理的內存標記了一下,表示該段內存已經被佔用。比如,它把每一段被佔用的內存給記錄下來(首地址,長度)
(p0,n0) (p1, n1) (p2, n2) ...
(3) MM非常慷慨:①只要有人 malloc ,它都同意借出 ②你不歸還,它永遠不會主動要求你 free 。
(4) MM管理的內存區域稱為「堆」Heap
這意味著,用戶程序應該自覺得及時 free ,以便不耽誤別的應用程序的使用。如果有個應用程序不停地 malloc ,而不 free ,那最終會用光MM的內存。當MM沒有更多閑置內存時, malloc 返回 NULL ,表示內存已經用完。
再次重申: 應用程序在malloc之後,應該盡早free !
使用原則:需要的時候再申請,不需要的時候立即釋放
實際上,MM對借出的內存塊進行標識
(p0, n0) (p1, n1) (p2, n2) ...
它內部已經保證任意兩塊內存不會「交疊」,即不會重疊,不會把一塊內存同時借給兩個應用程序使用。
所以,每塊內存的首地址都是不同的,在 free 的時候只需要指明首地址即可。
對象指的一塊內存
示例:用Citizen表示一個市民,用Car表示一個輛車。他起初沒有車,但未來可能有一輛車。
怎麼樣才算「及時」? 「不及時」會怎樣?
MM里可用的內存是有限的,你用完了就得盡快還,因為別的應用程序也需要MM的內存。
只借不還,積累到一定程度,MM沒有更多內存可用,於是malloc返回NULL。
要還就得全還,否則MM那邊處理不了
原因是:MM可能此時沒有閑置內存可用。(雖然這種情況一般不會發生)
free之後,該內存交還給MM,該內存不再可用(失效)
不一定要在相同的函數里釋放,在應用程序的任意一個角落釋放都是有效的。
也就是說:這一塊內存被malloc出來之後,完全交給你處置
功能:將 s 中當前位置後面的 n 個位元組 (typedef unsigned int size_t )用 ch 替換並返回 s
參數:
參數:
功能:由 src 所指內存區域復制 n 個位元組到 dest 所指內存區域。
memmove() 功能用法和 memcpy()) 一樣,區別在於: dest
和 src 所指的內存空間重疊時, memmove() 仍然能處理,不過執行效率比 memcpy() 低一些
5. C語言在哪些情況下需要free
當內存是用malloc申請的時候
使用後,需要free
其它情況一般不需要free
不過需要注意的是,有些庫函數 比如strp, 返回的是malloc的一個空間,用後也需要free
6. C語言內存管理機制--malloc/calloc/free原理與實現
一、C程序的存儲空間布局
在C程序中,存儲空間布局通常分為棧和堆兩種類型。棧用於函數調用時的局部變數存儲,其大小由編譯器自動管理,遵循後進先出(LIFO)原則。堆用於動態內存分配,可以由程序在運行時動態地請求和釋放內存。
二、Heap內存模型
在堆內存中,malloc所申請的內存主要從堆區域分配。Linux內核通過維護一個break指針來管理堆空間。這個指針指向堆空間的某個地址,從堆起始地址(Heap』s Start)到break之間的地址空間為映射好的(虛擬地址與物理地址的映射,通過MMU實現),可以供進程訪問。從break向上,是未映射的地址空間,訪問這些空間會導致程序報錯。
三、調整break:brk()和sbrk()
break指針最初位於bss段的末尾之後,當break指針升高時,程序可以訪問新分配區域內的任何內存地址,而此時物理內存頁尚未分配,內存會在進程首次試圖訪問這些虛擬內存地址時自動分配新的物理內存頁。
Linux通過brk和sbrk系統調用操作break指針。brk()將break指針設置為指定位置,地址四捨五入到下一個內存頁的邊界處。sbrk()將break指針在原有地址基礎上增加指定的大小。sbrk(0)返回當前break指針的位置。系統對進程所分配的資源有限,包括映射的內存空間。
四、malloc
malloc函數用於在系統中動態分配連續的可用內存。它要求內存大小至少為指定的位元組數,返回指向內存塊起始地址的指針,多次調用不重疊分配地址,實現內存分配和釋放。malloc函數的返回值總是位元組對齊,適合高效訪問C語言數據結構。
五、初探實現malloc
一個簡單實現的malloc函數直接從未映射區域劃出內存,但忽略了記錄分配的內存塊信息,導致內存釋放時無法確定釋放的大小,需要額外數據結構記錄塊信息。
六、正式實現malloc
實現一個完整的malloc需要一個數據結構組織堆內存,每個內存塊包含元信息(大小、空閑狀態、指針)和實際數據區域。查找合適的內存塊、分配新的塊、分裂塊等操作需實現相應函數。
七、calloc的實現
calloc函數用於給一組相同對象分配內存,並初始化它們。實現只需兩次調用malloc,一次分配內存,另一次初始化。
八、free的實現
free函數需要驗證地址的有效性,並解決碎片問題。實現策略包括合並相鄰空閑內存塊,確保釋放的地址與未映射區域之間是空閑的。
九、realloc的實現
realloc函數調整已分配內存的大小。實現包括復制現有內存、調整大小、釋放舊內存等操作。
十、總結
通過上述機制,C語言提供內存管理功能,允許程序動態分配和釋放內存。優化空間和實際應用的內存管理策略如Linux內核夥伴演算法、STL空間配置器等提供了更高效的實現。
7. c語言free的作用
你的程序太簡單, free之後沒有其它操作,所以那塊內存沒有被寫入其它內容.
free只是標記一下某塊內存可用,但並不重寫內容.
類似於刪除文件, 只是打上標記, 內容還在硬碟上,如果沒有被改寫,還是可以恢復的.