程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++基本入門教程(五):new和delete

C++基本入門教程(五):new和delete

編輯:關於C++

C++基本入門教程(五):new和delete。本站提示廣大學習愛好者:(C++基本入門教程(五):new和delete)文章只能為提供參考,不一定能成為您想要的結果。以下是C++基本入門教程(五):new和delete正文


關於之前沒有接觸過C++,然後首次接觸Cocos2d-x的同伙來講,能夠關於內存治理方面會比擬陌生。
也常常會由於內存成績招致各類小Bug,我也已經寫過一篇retain和release倒底怎樣玩?,用來駕御Cocos2d-x的對象援用和釋放也算是足夠了。
但,豈非年夜家就不想曉得retain和release面前的機密嗎?(小若:不想。)
 
沒錯,明天木頭來帶年夜家走進迷信,走進世界,一路來商量C++的new和delete。(小若:沒興致。)
 
好,既然年夜家都等不及了,那就開端吧~

1.靜態分派內存

我們都曉得,像“int num = 10;”如許的語句,聲清楚明了一個num變量,這個變量是須要內存來放置(就像你的文檔須要硬盤來放置)。
關於如許的通俗變量,是在編譯的時刻就分派好內存的。
沒錯,就像你出身的時刻就決議了是男是女了。(小若:這個比方感到一點關系都扯不上啊!並且,誰說出身就決議的?!)
 
經由過程聲明指針變量可以指向這些事後被分派好的內存地址,但,我們的指針可不只僅是為此而存在的。
指針還可以保留靜態分派的內存的地址。
那末,怎樣靜態分派內存呢?沒錯,就是new,以下代碼:

// 可以如許
int *p = new int;
// 還可以如許
int *p = new int();
// 應用
*p = 20;
// 最初,要釋放內存
delete p;

經由過程new前面隨著類型,便可以創立用於保留某品種型的內存空間,然後前往這個內存空間的地址。
它和直接聲明int變量的差別是:
1.new出來的變量在運轉法式的時刻才會請求內存,通俗int變量在編譯的時刻就分派了內存;
2.new出來的變量在不應用的時刻須要釋放失落,不然會內存洩漏,應用delete便可釋放指針指向的內存空間。

2.new和delete的配對

靜態請求的內存,在不應用的時刻,必定不要忘了釋放失落,不然會形成內存洩漏。
粗鄙地說,不,淺顯地說,靜態請求了內存,其實只不外是告知操作體系,這塊內存歸我了,其別人不克不及應用。
操作體系會乖乖地把你請求的那塊內存給你用,假如你沒有明白告知它你不須要這塊內存,則這內存永久都只能由你來應用。(固然,會成心外情形的,這個疏忽)
 
所以,相對不要忘卻,在不應用的時刻,要delete失落。
只需你new了一個變量,那就必需有對應的delete。

3.new、delete與reatin、release的關系

如今來看看Cocos2d-x內存治理,它就是為了讓我們可以疏忽new和delete的配對而出生的。
誰沒事想每天記住本身在哪裡new了,又在哪裡忘了delete呢?
 
所以,retain和release出生了。
Cocos2d-x的年夜部門對象都是應用create函數創立的,而create函數裡重要做了2件工作:
1.挪用new創立新對象,也就是請求了內存
2.將對象添加到內存治理池(詳細援用計數規矩我就不說了)
 
而Cocos2d-x的內存治理重要做的一件工作是:
1.檢討所以介入內存治理的對象,對那些須要釋放的對象挪用delete,釋放內存
 
是以,我們不須要本身去保護new和delete,創立對象的時刻,把對象交給內存治理便可以了。
假如我們不挪用retain,那末,對象會鄙人一次內存治理檢討的時刻被釋放(也就是下一幀)。
同時,addChild等函數都邑自動挪用一次對象的retain函數,所以被addChild的對象都不會被釋放。
而在分開場景等操作時,對象也會被挪用release函數,抵消一次retain的感化。
 
除非需要,不然,我們不須要自動挪用retain函數,這就是“主動內存治理”的根本規矩了。

4.靜態數組

除靜態創立變量以外,數組也能夠靜態創立:int *nums = new int[10];
而對應的,釋放靜態數組有點特殊:delete [] nums;
在delete前面須要加上一個[],代表釋放的是數組。
 
靜態數組的應用和普通數組差不多,固然,也有小差異:

 int *nums = new int[3];
    nums[0] = 1;
    nums[1] = 2;
    nums[3] = 3;
    cout << nums[0];
    nums += 1;
    cout << nums[0];

第一次應用cout輸入nums[0]時,輸入的就是第一個元素的值:1。
然則,當挪用了nums += 1時,指針nums曾經指向了下一個地址,也就是nums[1]地點的地址。
所以,這時候候再挪用nums[0],輸入的也是第一個元素的值,但此時的第一個元素曾經不是1,而是2了。

5.停止

好了,關於new和delete臨時到這裡。
但關於指針的初步引見還有一小部門,下一篇再引見吧~

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved