如果一個人自稱為程序高手,卻對內存一無所知,那么我可以告訴你,他一定在吹牛。用C或C++寫程序,需要更多地關注內存,這不僅僅是因為內存的分配是否合理直接影響著程序的效率和性能,更為主要的是,當我們操作內存的時候一不小心就會出現(xiàn)問題,而且很多時候,這些問題都是不易發(fā)覺的,比如內存泄漏,比如懸掛指針。我們的就從內存開始吧,準備好了嗎? Let’s go!
Win32的可執(zhí)行文件在加載后,系統(tǒng)將為它建立一個它自己的虛擬內存空間,即進程空間,其容量達4G。這4G的空間劃分為了幾個區(qū)域,對于win98和win2000是不盡相同的。
內存大小的描述單位是:字節(jié)
1. NULL指針分區(qū)是NULL指針的地址范圍。
對這個區(qū)域的讀寫企圖都將引發(fā)訪問違規(guī)。
2. DOS/WIN16分區(qū)是98中專門用于16位的
DOS和windows程序運行的空間,所有的16
位程序將共享這個4M的空間。Win2000中不
存在這個分區(qū),16位程序也會擁有自己獨立的虛擬地址空間。有的文章中稱win2000中不能運行16位程序,是不確切的。
3.用戶分區(qū)是進程的私有領域,Win2000中,程序的可執(zhí)行代碼和其它用戶模塊均加載在這里,內存映射文件也會加載在這里。Win98中的系統(tǒng)共享DLL和內存映射文件則加載在共享分區(qū)中。
4.禁止訪問分區(qū)只有在win2000中有。這個分區(qū)是用戶分區(qū)和內核分區(qū)之間的一個隔離帶,目的是為了防止用戶程序違規(guī)訪問內核分區(qū)。
5. MMF分區(qū)只有win98中有,所有的內存映射文件和系統(tǒng)共享DLL將加載在這個地址。而2000中則將其加載到用戶分區(qū)。
6. 內核方式分區(qū)對用戶的程序來說是禁止訪問的,操作系統(tǒng)的代碼在此。內核對象也駐留在此。