1樓:網友
過載記憶體申請和釋放的操作符,自己管理,比較複雜。
2樓:匿名使用者
這段**有記憶體洩露的危險,因為c++標準明確指出,當子類物件經由基類指標刪除時,倘若基類帶有乙個non-virtual(非虛)解構函式,此時其結果為undefined(未定義).這在c++中最後變為了乙個通用的程式設計方法:既對乙個有可能做為基類的類,其解構函式最好宣告為virtual的,這可以保證在使用多型的情況下,通過基類指標正確刪除子類物件。
分析如下:考慮從tree類繼承,下面是子類**:
class child:public treeprivate:
char *pc;
public:
child()
pc=new char[100]; 這裡假設此操作不為丟擲任何異常。
child()
delete pc;
tree *pt=new child();通過基類指標引用子類物件。
delete pt; /此時只是刪除剛剛構建的子類物件中的基類成分。
而子類的解構函式可能根本不會呼叫,從而使子類/ 的資源發生洩露。
但若將tree類的解構函式加上virtual,則c++會保證在以上的情況下準確呼叫child的解構函式來釋放資源。注意,我的child類解構函式並沒有宣告為virtual的,因為這裡假設其作為tree的子類,而虛擬是有繼承性的,當tree解構函式為virtual時,child解構函式自動變為virtual...
另外,站長團上有產品**,便宜***。
c++:關於函式在記憶體中的位置
3樓:
1.類並不是記憶體的物理實體,就是說在編譯之後的記憶體空間佈局中是沒有類這個概念的,還是以函式的形式來組織的,也就是說類是個邏輯概念。
2.這個東西,很顯然和編譯器以及你的優化有關係的,if 和while佔的記憶體不過也就三四條指令的空間。編譯器會把他轉化為彙編,彙編什麼樣子就決定了他的記憶體空間。
4樓:網友
推薦一本書《程式設計師的自我修養》
c++中記憶體中物件的成員函式跑哪去了?
5樓:何度千尋
成員函式可以被看作是類作用域的全域性函式,不在物件分配的空間裡,只有虛擬函式才會在類物件裡有乙個指標,存放虛擬函式的位址等相關資訊。
成員函式的位址,編譯期就已確定,並靜態繫結或動態的繫結在對應的物件上。
物件呼叫成員函式時,編譯器可以確定這些函式的位址,並通過傳入this指標和其他引數,完成函式的呼叫,所以類中就沒有必要儲存成員函式的資訊。
c++堆中記憶體在函式呼叫結束時會釋放嗎
6樓:我心如一
可以作為返回值,用new分配的動態單元,理論上見到delete才能釋放其儲存單元,但實際上當程式執行結束時,如果仍未見到delete,系統也會自動釋放。
7樓:
c++在執行函式的時候會先給函式體開闢一段記憶體來存貯函式的操作,執行完後函式的變數會釋放,函式體(也就是函式**)不會釋放,一直在**段中,以後要呼叫的時候還可以進行呼叫。返回的函式值會放在你定義好的變數中,如果你沒有接收返回值,那麼該返回值會被丟棄。預設的解構函式什麼都不做的,如果要釋放記憶體 需要自己加上。
解構函式就是在物件生命週期結束時自動調的最後乙個函式,需要實現什麼功能都由自己控制。
8樓:網友
可以。只要沒有delete,都是在程式執行結束後才釋放空間。
9樓:網友
long autolinkcom(long * port)
port是乙個指標,應該這樣宣告。
dllimport("", entrypoint = "autolinkcom")]
public static extern long autolinkcom(intptr port);
或者[dllimport("", entrypoint = "autolinkcom")]
public static extern long autolinkcom(ref long port);
c++裡面函式的引數在記憶體中是怎麼儲存的?
10樓:匿名使用者
就如你問題中提到的,當函式int max(int x,int y)被賦予實參時,如下面**所示。
int main()
此時函式max接收到的是a和b的拷貝值,也就是說函式在堆裡面開闢乙個空間,這個空間儲存著兩個值,分別是3和4,函式接下來操作的數值都是這個堆空間上的數值,跟main函式里面的a和b無關,當函式執行完畢時(也就是return執行完)會**空間,這時堆空間裡面的3和4就會被處理掉。
11樓:匿名使用者
如果變數不多於三個(四個?)時,是使用暫存器傳值的,進入到函式里面就是直接使用暫存器;如果超過四個,那就要藉助堆疊(stack),即呼叫函式前先把數值壓棧,然後在函式里面把堆疊裡的資料取到暫存器中運算,函式呼叫結束時,堆疊還原就自動把變數去掉了。
12樓:匿名使用者
建議你用vc吧彙編檔案也編譯出來看看彙編** 這些變數是怎麼處理的就可以理解了。
c++什麼辦法可以獲取xx.exe所佔的記憶體量 或者說可以通過什麼方法獲取xx.exe的記憶體量
13樓:
1、定義乙個全域性變數用於統計使用記憶體的大小。
2、封裝乙個動態分配和釋放記憶體的函式。所以分配和釋放記憶體的地方都呼叫此函式。
3、分配記憶體的函式中是將size累加至此全域性變數,釋放記憶體時減去size。
執行時根據此全域性變數的值可以知道動態使用的記憶體大小。
14樓:西茜王子
沒有辦法獲得,比如呼叫了new char(1000),另外乙個程序是無法獲得的記憶體量的。
況且大部分情況下這個記憶體量是變化的。不是固定的。
c++中記憶體分配與刪除耗時間嗎??
15樓:風若遠去何人留
是需要消耗時間的。
記憶體分配時,需要向系統進行申請,系統會對剩餘連續記憶體做查詢,查詢到合適的記憶體塊後,再對該塊寫乙個已被使用的標識位。然後再把分配到的記憶體位址返回。
記憶體刪除的時候,是分配的乙個反向過程,想系統申請,清除被使用標記為,系統將記憶體**,返回。
這個時間非常短,短到只有幾十或幾百微妙,但一定是有時間消耗的。
在c++中,記憶體分配有兩種途徑,通過new/delete和通過malloc/free。
其中new/delete要比malloc/free更高效。因為new和delete是c++的運算子,而malloc/free是c++的函式。前者的呼叫省去了函式呼叫相關操作。
所以在c++程式設計中,要儘量使用new/delete來進行動態記憶體的分配/刪除操作。
16樓:網友
無論是棧的建立和銷燬,還是new delete都要費時間,任何語言的任何語句都費時間,只不過很快,快到沒感覺。
17樓:網友
程式裡面最耗時間的就是記憶體的分配,所以好的**要儘量避免new方法,可以的話多用用用空間換時間的方法。
18樓:寒花葬
耗時很少。大量的迴圈和磁碟io比較耗時。若對記憶體進行幾千次的不斷重複的開闢記憶體與釋放,同開闢一次記憶體之後不釋放相比,節約的時間很有限,幾乎可以忽略。
只是幾千次的不斷重複的開闢記憶體與釋放,很容易造成記憶體碎片化。
c++解構函式是怎麼釋放記憶體的?
19樓:網友
你在方法2中可能例項化類1時沒有初始化指標,或者指標為空,程式結束時,呼叫解構函式delete乙個野指標或空指標的時候就可能會出錯了,而你把方法1的指標換成物件,在程式結束的時候,即使你沒有清理,編譯器都會幫你釋放空間的,因此不會出錯。
20樓:網友
自動生成的只會原樣複製。如果你的類裡有乙個指標,你給它分配了記憶體,然後在解構函式中釋放記憶體。如果使用自動生成的複製函式會造成重複釋放記憶體。
如果我用了new來分配記憶體 我又使用了 解構函式來釋放記憶體 會怎樣呢?
class c
c()private:
char *p;
c a;c b(a); //這裡使用系統生成的拷貝建構函式。 與是相同的。a和b的解構函式都會刪除p,就會重複刪除而出錯。
21樓:網友
關於解構函式的說明:
1。當程式的執行離開例項化自動物件所在的作用域時,自動物件就會撤銷,這時解構函式隱式呼叫。並不是說在main函式結束時才執行。
2。解構函式本身並不釋放物件佔用的記憶體空間,它只是在系統收回物件的記憶體空間之前執行掃尾工作。解構函式體內並不一定要有delete語句。可以有也可以沒。
3。和建構函式一樣,每個類都有乙個解構函式,即使沒有顯式提供乙個解構函式,編譯器也會生成乙個空的解構函式 .
補充說明:離開例項化自動物件所在的作用域這句的意思就是說比如你有乙個自定義類和乙個自定義函式,你在這個函式里宣告乙個這個類的物件,這個物件就是例項化自動物件,它的作用域僅限於該函式體內,然後你在main函式里呼叫這個函式,呼叫結束後,那個類的物件就離開了它的作用域,這時,那個類的解構函式就會被編譯器隱式呼叫。
當主函式結束,**記憶體的工作就開始了,但這個工作是由編譯器的記憶體**機制在後臺執行。如果在類的實現中,有動態分配記憶體和動態分配陣列的語句,那麼最好在解構函式里提供delete語句!
更正二樓的乙個觀點,解構函式絕不是在main函式結束時自動執行的!!!
工日消耗量是什麼,定額人工工日消耗量的計算
hi漫海 工日消耗量是完成一定工程量所需要的人工 人工的工日數可以有兩種確定方法 一種以勞動定額為基礎確定 一種以現場觀察測定資料為基礎計算。遇到勞動定額缺項時,採用現場工日寫實的測時方法確定和計算定額的人工工日消耗量。預算定額中人工工日消耗量是指在正常施工條件下,生產單位合格產品所必需消耗的人工工...
C語言中函式的定義格式是什麼,函式原型宣告的語法格式
天雲一號 函式定義就是規定函式的格式與功能。函式宣告就是在函式呼叫之前進行的一種說明。下面舉例說明兩者的語法格式 include int fun int a,int b 函式的宣告void main 下面的fun函式就是函式的定義 int fun int a,int b 注 如果被調函式 上例中為f...
C 中min函式和max函式的標頭檔案是什麼
詮釋美麗瞬間 拓展資料 包含在c 標準庫中標頭檔案中,在標頭檔案中定義了min,max的巨集,若在包含的同時包含會導致函式無法使用。 赤明魔王 包含在c 標準庫中標頭檔案中,在標頭檔案中定義了min,max的巨集,若在包含的同時包含會導致函式無法使用。提供了 cpp min等函式來代替min函式的功...