mallco動態分配_malloc動態分配的內存的生存周期是多少?

曾經有一個朋友提過這樣一個問題,malloc動態分配的內存的生存周期是多少當時直接回答,當然是在調用free進行釋放之前阿!!但回頭我仔細想過這個問題,在free調用之前那段范圍內,但free只有一個指針參數,它是如何知道要釋放多少空間呢比如:

int*pInt=(int*)malloc(10*sizeof(int));

…….;

free(p);

這里free是如何知道釋放10個int大小的空間呢既然free只需要一個參數—指針類型,那么這個地址(malloc返回的)一定作過什么特殊處理了.于是我問了一些網上的朋友,我得出以下一些結果:

char*p=malloc(size):

1. 實際分配一塊size + 4大小的內存,char *p = 內存首地址。

2. *((int *)p) = size; //把大小放在分配內存的起始處。

3. return (void*)(p + 4); //返回除去存放大小以后的部分。

free(p); 1. char* q = (char *)p - 4;

2. int size = *((int *)q); //這里找到了size...

3. 通過操作系統釋放內存或自己管理C/C++堆內存.

這里要涉及到一些OS管理內存得問題,非我力所能及,但我們可以知道,malloc確實實施了一些特殊的處理.言歸正傳.讓我們看看下面一段c++代碼:

int*p=new int;

delete []p;

一眼就看出上面得代碼完成的和上面的c代碼一樣的功能.這里有同樣的問題,為什么delete

能在不指定動態分配的數組size下就能釋放所分配的對象呢,是不是new操作也對返回的地址作了一些手腳?答案:是.new所作的處理和上面的方法一樣的,即:new所傳回的每一個內存區域配置一個額外的DWORD,然后把元素數目包藏到那個DWORD中.(不是所有編譯器都采用這個方法的,我只試過vc6和bcc55編譯器,它們都采用這個方法.不過,深度探索c++對象模型上只是說配置一個額外的word兩字節).為了驗證這個說法,我寫下了下面的代碼進行測試.

#includeiostream.h

class complex

{

public:

complex(int=0,int=0){cout"complex()"endl;}

~complex(){cout"~complex()"endl;}

private:

int i,j;

};

int main()

{

complex*array=new complex;

long*t=(long*)((char*)(array)-4);

cout*tendl;//(1)

//*t=20; //(2)

delete []array;

return 0;

}

其中(1)輸出array數組的維數10.這里很明顯了,動態分配complex對象的個數就是放在返回array地址前一個DWORD(四個字節)內.現在問題解決了,我們已經知道new所作的什么處理了,^_^,不過問題又來了,編譯器采取的策略會不會引起我們憂慮對,的確,只要我們修改那個DWORD的內容,那delete就不能正確釋放所分配的內存空間了.(^_^.你試試把(2)前面那條的注釋給去掉,就會有意想不到的輸出)

結論:c++編譯器為我們做了太多的事,導致了c++很復雜,有些東西,讓編譯器修改得連我們都不認識自己的代碼了,有些東西如果搞明白了,學其他的(比如COM,ATL等,雖然本問與此關系不大)或許會輕松許多的.

補充:這是小弟第一篇處女作,肯定有很多說得不當的地方,還請各位大小諒解.我得于眾多csdn上的朋友相助,還參考了侯老師的那本深度探索c

++對象模型

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397275.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397275.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397275.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

中興中心管理服務器fxh3120,中興多媒體業務中心ZXMS80

運營支撐層: 提供面向視訊用戶的客服中心和面向管理員的業務中心、網管中心。客服中心提供會議預約、會議控制、帳單查詢、意見反饋等功能。業務中心分為業務受理中心、業務管理中心、認證計費中心。其中業務受理中心實現開戶、放號及收費等功能;業務管理…

隨機森林經典文

原文鏈接 轉載于:https://www.cnblogs.com/luoganttcc/p/10525324.html

python namespace unique_Python使用uuid庫生成唯一標識ID

uuid是128位的全局唯一標識符(univeral unique identifier),通常用32位的一個字符串的形式來表現。有時也稱guid(globalunique identifier)。python中自帶了uuid模塊來進行uuid的生成和管理工作。python中的uuid模塊基于信息如MAC地址、時間戳、命名空間、隨機數、偽…

SQL Server 2008空間數據應用系列四:基礎空間對象與函數應用

SQL Server 2008空間數據應用系列四:基礎空間對象與函數應用 原文:SQL Server 2008空間數據應用系列四:基礎空間對象與函數應用友情提示,您閱讀本篇博文的先決條件如下: 1、本文示例基于Microsoft SQL Server 2008 R2調測。 2、具…

HBase-1.2.4LruBlockCache實現分析(一)

一、簡介 BlockCache是HBase中的一個重要特性,相比于寫數據時緩存為Memstore,讀數據時的緩存則為BlockCache。 LruBlockCache是HBase中BlockCache的默認實現,它采用嚴格的LRU算法來淘汰Block。 二、緩存級別 目前有三種緩存級別&#xf…

c .net ajax,Asp.net mvc 2中使用Ajax的三種方式

在Asp.net MVC中,我們能非常方便的使用Ajax。這篇文章將介紹三種Ajax使用的方式,分別為原始的Ajax調用、Jquery、Ajax Helper。分別采用這三種方式結合asp.net mvc去實現一個史上最簡單的留言板。首先看一下原始的Ajax的調用的:定義CommentController&am…

爆款AR游戲如何打造?網易楊鵬以《悠夢》為例詳解前沿技術

本文來自網易云社區。 7月31日,2018云創大會游戲論壇在杭州國際博覽中心103B圓滿舉行。本場游戲論壇聚焦探討了可能對游戲行業發展有重大推動的新技術、新實踐,如AR、區塊鏈、安全、大數據等。 網易AR游戲生態合作負責人楊鵬表示,傳統游戲模式…

景深決定照相機什么特性_照相機光圈與景深的關系

展開全部「光圈」,光圈是一個用來控制光線透過鏡頭,進入機身636f70793231313335323631343130323136353331333264663664內感光面的光量的裝置,它通常是在鏡頭內。表達光圈大小我們是用f值。光圈f值鏡頭的焦距/鏡頭口徑的直徑從以上的公式可知要…

潤乾V4導出TXT時自定義分隔符

◆ 背景說明 報表中,導出text時,默認沒有分隔符;應用中對導出Text,希望能自定義分隔符。在tag中定義了 textDataSeparator屬性,讓用戶在導出Text時自定義分隔符,從而確保滿足應用…

Spark學習體會

在去年圖計算工作中,和公司里實習的博士生嘗試過Spark后,發現Spark比Hadoop在計算速度上后很大的提高。Spark的計算使用Scala語言編寫代碼,其中圖計算用到了GraphX。對Spark技術的學習已經非常重要。 最近半年多時間里,經常看…

fastadmin自定義按鈕不是ajax,Fastadmin 自定義按鈕實現審核功能

功能描述新增自定義審核按鈕,點擊審核按鈕后,按鈕變為取消審核按鈕,同理點擊取消審核按鈕后,按鈕變為審核按鈕實現功能如下圖微信圖片_20200827112914.png上代碼{field: operate, title: __(Operate), table: table, events: Tabl…

函數的命名空間以及作用域

轉載于:https://www.cnblogs.com/mpfei/p/9451208.html

python獲取路由器數據包pppoe_PPPoE協議***4:如何得到PPPoE服務器的mac地址

在局域網中,怎樣得到PPPoE服務器的mac地址是一件頭疼的事情,特別是在windows環境下;得到PPPoE服務器mac地址的實現方法有兩種:1.在windows下,我們運行wireshark軟件,可以得到所有進出網卡的數據包格式和內容…

使用vs自帶的性能診斷工具

visual studio是個強大的集成開發環境,內置了程序性能診斷工具。下面通過兩段代碼進行介紹。 static void Main( string[] args){Test1();Test2();Console.ReadKey();}protected static void Test1(){Stopwatch sp new Stopwatch();sp.Start();string str "&…

Avg_row_length是怎么計算的?

通過一下命令我們可以獲取表的使用情況: rootmysql 05:49:33>show table status like tbname\G 結果: *************************** 1. row ***************************Name: tbnameEngine: InnoDBVersion: 10Row_format: CompactRows: 3425Avg_row_…

1.用代碼演示String類中的以下方法的用法 (2018.08.09作業)

1 public class Test_001 {2 3 public static void main(String[] args) {4 String a "德瑪西亞!";5 String b "";6 String c "aBcDefG";7 String d " 123321 ";8 System.out.println…

【Java基礎】List迭代并修改時出現的ConcurrentModificationException問題

現在有一個需求,要遍歷一個List,假設List里面存儲的是String對象,然后該需求事判斷里面如果有某個對象,則添加一個新的對象進去。自然,我們得出下面的代碼: import java.util.ArrayList; import java.util.…

tp5框架原理詳解_TP5框架安全機制實例分析

本文實例講述了TP5框架安全機制。分享給大家供大家參考,具體如下:防止sql注入1、查詢條件盡量使用數組方式,具體如下:$wheres array();$wheres[account] $account;$wheres[password] $password;$User->where($wheres)->f…

碧藍航線8.20服務器維護,碧藍航線半人馬來襲 8.20更新公告

半人馬來襲!碧藍航線將于8月20日9:00~11:00對安卓、iOS全港區進行為期2小時的改造建設,維護后將開啟限時活動「盛夏的半人馬座」,一起來看看吧。一、內容新增1.開啟限時活動「盛夏的半人馬座」,活動時間8月20日維護后~8月30日&…

MySQL安裝與設置

下載zip,配置 1,系統變量添加:...\mysql-5.7.10-winx64,環境變量添加:%MYSQL_HOME%\bin 2,修改MySQL.ini basedir(同系統變量路徑) datadir(系統變量路徑\data) port 33…