成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++程序中的內存方式介紹

開發 后端
在C++程序內存分配方式有三種: 從靜態存儲區域分配、在棧上創建以及從堆上分配,亦稱動態內存分配,歡迎大家學習討論。

對第一次接觸到C++程序的用戶和學者來說,了解C++語言的概念是非常重要的,那么就先說一下什么是C++語言,所謂C++語言:是一種使用非常廣泛的計算機編程語言。

C++程序內存分配方式有三種:

(1) 從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,static變量。

(2) 在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置于處理器的指令集中,效率很高,但是分配的內存容量有限。

(3) 從堆上分配,亦稱動態內存分配。程序在運行的時候用malloc或new申請任意多少的內存,程序員自己負責在何時用free或delete釋放內存。動態內存的生存期由我們決定,使用非常靈活,但問題也最多。

發生內存錯誤是件非常麻煩的事情。編譯器不能自動發現這些錯誤,通常是在程序運行時才能捕捉到。而這些錯誤大多沒有明顯的癥狀,時隱時現,增加了改錯的難度。有時用戶怒氣沖沖地把你找來,程序卻沒有發生任何問題,你一走,錯誤又發作了。

C++程序編程新手常犯這種錯誤,因為他們沒有意識到內存分配會不成功。常用解決辦法是,在使用內存之前檢查指針是否為NULL。如果指針p是函數的參數,那么在函數的入口處用assert(p!=NULL)進行檢查。如果是用malloc或new來申請內存,應該用if(p==NULL) 或if(p!=NULL)進行防錯處理。

犯這種錯誤主要有兩個起因:一是沒有初始化的觀念;二是誤以為內存的缺省初值全為零,導致引用初值錯誤(例如數組)。內存的缺省初值究竟是什么并沒有統一的標準,盡管有些時候為零值,我們寧可信其無不可信其有。

所以無論用何種方式創建數組,都別忘了賦初值,即便是賦零值也不可省略,不要嫌麻煩。毛病出在函數GetMemory中。編譯器總是要為函數的每個參數制作臨時副本,指針參數p的副本是 _p,編譯器使。

如果函數體內的程序修改了_p的內容,就導致參數p的內容作相應的修改。這就是指針可以用作輸出參數的原因。在本例中,_p申請了新的內存,只是把_p所指的內存地址改變了,但是p絲毫未變。所以函數GetMemory并不能輸出任何東西。事實上,每執行一次GetMemory就會泄露一塊內存,因為沒有用free釋放內存。

對于非內部數據類型的對象而言,光用maloc/free無法滿足動態對象的要求。對象在創建的同時要自動執行構造函數。對象在消亡之前要自動執行析構函數。由于malloc/free是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行構造函數和析構函數的任務強加于malloc/free。

類Obj的函數Initialize模擬了構造函數的功能,函數Destroy模擬了析構函數的功能。函數UseMallocFree中,由于malloc/free不能執行構造函數與析構函數,必須調用成員函數Initialize和Destroy來完成初始化與清除工作。函數UseNewDelete則簡單得多。

所以我們不要企圖用malloc/free來完成動態對象的內存管理,應該用new/delete。由于內部數據類型的“對象”沒有構造與析構的過程,對它們而言malloc/free和new/delete是等價的。

既然new/delete的功能完全覆蓋了malloc/free,為什么C++程序不把malloc/free淘汰出局呢?這是因為C++程序經常要調用C函數,而C程序只能用malloc/free管理動態內存。

如果用free釋放“new創建的動態對象”,那么該對象因無法執行析構函數而可能導致程序出錯。如果用delete釋放“malloc申請的動態內存”,理論上講程序不會出錯,但是該程序的可讀性很差。所以new/delete必須配對使用,malloc/free也一樣。

有一個很重要的現象要告訴大家。對于32位以上的應用程序而言,無論怎樣使用malloc與new,幾乎不可能導致“內存耗盡”。我在Windows 98下用Visual C++編寫了測試程序,見示例7-9。這個程序會無休止地運行下去,根本不會終止。因為32位操作系統支持“虛存”,內存用完了,自動用硬盤空間頂替。我只聽到硬盤嘎吱嘎吱地響,Window 98已經累得對鍵盤、鼠標毫無反應。#t#

我可以得出這么一個結論:對于32位以上的應用程序,“內存耗盡”錯誤處理程序毫無用處。這下可把Unix和Windows程序員們樂壞了:反正錯誤處理程序不起作用,我就不寫了,省了很多麻煩。

責任編輯:chenqingxiang 來源: 計世網
相關推薦

2010-02-03 14:10:28

C++內存邏輯區域

2010-01-25 18:15:52

2018-02-24 12:17:56

C程序內存方式

2011-06-21 10:17:41

c++內存模型

2010-01-19 17:54:47

C++程序

2010-02-04 14:29:45

C++ typenam

2010-02-06 16:21:35

C++常規DLL

2011-07-20 15:08:22

C++

2011-07-20 15:58:53

C++引用

2011-06-16 09:28:02

C++內存泄漏

2023-11-17 11:40:51

C++內存

2010-02-04 15:41:10

C++內存管理

2011-07-15 01:10:13

C++內存分配

2021-09-07 09:23:07

C++字符串算法

2010-01-22 13:31:58

C++標準庫

2010-01-19 09:39:43

C++標準程序庫

2010-01-19 09:39:43

C++標準程序庫

2024-01-09 09:23:12

指針C++

2011-07-20 17:16:50

C++重載函數

2019-09-29 00:25:11

CC++內存泄漏
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品91| 成人精品免费 | 亚洲精品九九 | 欧美啊v在线观看 | 欧美精品网站 | 国产精品久久久久久久7电影 | 欧美成人高清 | 日韩中文不卡 | 日本一卡精品视频免费 | 国产亚洲区| 二区在线观看 | 国产精品特级毛片一区二区三区 | 羞羞视频在线观免费观看 | 最新国产视频 | 久久精品免费观看 | 中文字幕免费中文 | 日本视频在线播放 | 成人精品一区 | 久久久久国产一区二区三区四区 | 蜜臀av日日欢夜夜爽一区 | 国产99久久久国产精品 | 久久久精品视频免费 | 在线精品一区二区 | 日韩国产中文字幕 | 日本久久精| 国产做爰 | av中文字幕在线 | 国产成人精品一区二区三区四区 | 欧美一级片在线 | 日韩精品成人av | 国产精品美女久久久久久不卡 | 成人精品一区二区户外勾搭野战 | 欧美日韩国产一区二区三区 | 久久久久九九九女人毛片 | 免费在线视频一区二区 | 亚洲一视频 | 欧美精品一区二区免费 | www日本在线 | 91视频一区二区 | 成人综合一区 | 在线激情视频 |