1樓:匿名使用者
effective c++一書中如此描述:
1.當你使用new時,有兩件事會發生。第一,記憶體被配置(透過函式operator new)。
第二,會有一個(或以上)的constructors針對此記憶體被呼叫。當你使用delete時,也有兩件事發生:一個(或以上)的destructors會針對此記憶體被呼叫,然後記憶體被釋放(透過函式operator delete)。
2.如果你使用delete是未加括號,delete便假設刪除物件是單一物件。否則便假設刪除物件是個陣列。
string *stringptr1 = new string;
string *stringptr2 = new string[100];
delete stringptr1;
delete stringptr2;
如果你對著stringptr1使用「形式,其結果未定義。如果你對著stringptr2沒有使用「形式,其結果亦未定義。猶有進者,這對內建型別如int者亦未定義,即使這型別別並沒有destructors。
4.因此,規則很簡單,如果你在呼叫new時使用了,則你在呼叫delete時也使用,如果你在呼叫new的時候沒有,那麼你也不應該在呼叫時使用。
注:在vc中,delete可以取代delete.
2樓:匿名使用者
不會出錯。
不過最好是判斷一下,a是不是為空,不為空時在刪除。
3樓:匿名使用者
在c++中,前面定義整型指標(int *a = new int;)後面應用運算子的形式為:delete a;delete 應該是不正確的;
c語言三目運算子問題。
4樓:陌上
如果y值為0則輸出的是後面的「no」然後回車,如果不為0則直接輸出回車。判斷語句中0為假。不為0為真。
c++中delete的用法
5樓:miffy___懶陽
"c++記憶體管理不同方式分析c++迭代器基本內容講述c++淺拷貝具體內容講述c++**函式**示例解讀c++二維陣列new幾種應用方法點評。
new和c++ delete運算子用於動態分配和撤銷記憶體的運算子。
new用法:
1. 開闢單變數地址空間。
1)new int; /開闢一個存放陣列的儲存空間,返回一個指向該儲存空間的地址。int *a = new int 即為將一個int型別的地址賦值給整型指標a.
2)int *a = new int(5) 作用同上,但是同時將整數賦值為5
2. 開闢陣列空間。
一維: int *a = new int[100];開闢一個大小為100的整型陣列空間。
二維: int **a = new int[5][6]
三維及其以上:依此類推。
一般用法: new 型別 [初值]
c++ delete用法:
1. int *a = new int;
delete a; /釋放單個int的空間。
*a = new int[5];
delete a; /釋放int陣列空間。
要訪問new所開闢的結構體空間,無法直接通過變數名進行,只能通過賦值的指標進行訪問。
用new和c++ delete可以動態開闢,撤銷地址空間。在程式設計序時,若用完一個變數(一般是暫時儲存的陣列),下次需要再用,但卻又想省去重新初始化的功夫,可以在每次開始使用時開闢一個空間,在用完後撤銷它。"
6樓:針雰勤思慧
delete和new配合使用。
就是new了一個物件,不用的時候必須delete否則會產生記憶體洩露。會使程式崩潰。
前面肯定有new。你可以搜一下new和delet的用法。
c++中new和delete的用法
7樓:肥仙女
在c++程式設計中,使用new分配的陣列可用delete釋放。這裡釋放的是動態分配的陣列空間,而不是靜態分配的陣列空間,詳細步驟:
1、例如,我們動態建立了一個一維int陣列arr,現在需要將它釋放。
2、這時只需要使用delete陣列名即可。
3、注意,要釋放陣列所佔的記憶體,不能少。否則,用delete則不能完全釋放陣列所佔記憶體空間。
4、例如,我們為一個二維陣列arr動態分配了記憶體空間。現在需要將它釋放。
5、這時候,單單使用一句deletearr是不夠的。
6、而是應該先釋放為二維陣列的每行分配的空間(即deletearr[i]),再釋放為行指標分配的空間(即deletearr)。
7、經過這樣兩步,動態分配的二維陣列空間才算徹底地釋放。至於多維陣列的釋放,其本質和二維陣列是相似的,可以參考二維陣列的方法。下圖為編譯執行截圖。
可以看到,順利執行,沒有非法的記憶體訪問,也沒有報錯。
8樓:過段時間換個
new分配記憶體,delete釋放記憶體,就這麼簡單。。。囧。。。
舉個簡單的例子。
int * p = new int;
delete p;
使用完p後,要把記憶體釋放了。
c++關於new和delete的問題,求正確答案和解答。
9樓:網友
new分配的記憶體空間不會自動**, 必須手動用delete來釋放, 所以b是錯誤的, 記住new和delete是成對出現的, 還有就是malloc和free也是。
new和delete運算子 c/c++
10樓:匿名使用者
c++中,new的用法很靈活,這裡進行了簡單的總結:
new() 分配這種型別的一個大小的記憶體空間,並以括號中的值來初始化這個變數;
new 分配這種型別的n個大小的記憶體空間,並用預設建構函式來初始化這些變數;
當使用new運算子定義一個多維陣列變數或陣列物件時,它產生一個指向陣列第一個元素的指標,返回的型別保持了除最左邊維數外的所有維數。
delete用於釋放申請的記憶體空間。
釋放由new申請的空間可以使用delete,釋放由new申請的空間可以使用delete
11樓:**完以後
在c++語言中,仍然支援malloc()和free()來分配和釋放記憶體,同時增加了new
和delete來管理記憶體。
1.為固定大小的陣列分配記憶體。
#include
int main()
在刪除陣列時,delete運算子後要有一對方括號。
2.為動態陣列分配記憶體。
#include
#include
int main()
c++中運算子new和delete的功能分別是什麼?
12樓:手機使用者
& 在定義的時候在變數的的左邊是引用 int & a;
運算的時候是取地址,這是繼承了c語言的。 例 int *p =&a;
:: 這個是類直接訪問成員的符號 例 a::f();
new 開闢記憶體,生成物件用的。
. 對想訪問其成員用的。
->是物件指標訪問其成員用的。
多看看書吧。
這些都很基礎的。
13樓:匿名使用者
new 申請記憶體,呼叫建構函式。
delete 釋放記憶體,呼叫解構函式。
14樓:匿名使用者
new 開闢記憶體空間。
delete 收回記憶體空間。
c++運算子過載有問題
15樓:匿名使用者
賦值運算子過載要讓指標成員獨立指向一塊記憶體,並複製資料,不應簡單複製地址,否則可能引起指標懸掛問題。
補充:你裡面後,沒有**舊記憶體(原指向的記憶體),是記憶體洩露,問題很嚴重。
z為區域性變數,返回值後,它的記憶體就**了,在析構中也**了;
你賦值語句不申請新記憶體並複製資料,所以你的s3=(s1+s2);之後指向了已經**的記憶體。
另外 還需要有一個拷貝建構函式string(string&scr);
string(string& src)
修改後:/*6. 過載運算子『+』與『-』用於字串的連線,其中main函式為:
void main()
要求執行結果為:
某某大學 計算機學院歡迎您!
某某大學計算機學院歡迎您!*/
#include
#include
using namespace std;
class string
;string(string& src)
string()
;void display();
friend string operator-(string &,string &)
friend string operator+(string&,string&);
string operator=(const string&);
~string();
void string::display()
void main()
C三目運算子問題關於c三目運算子的問題
三目運算就是下面這算式了 a a a z a 32 a它的意思是 a代表的字元在小寫字母 a 和 z 之間嗎?如果是,運算結果是a 32 如果不是,結果是a 這段程式應該是字母大小寫轉換,但有點問題。如果是想把小寫轉成大寫,後面應該是 a 32 如果是想把大寫轉成小寫,引號裡應該是大寫字母a和z 語...
c 運算子過載問題
1 注意 有字首和字尾之別,字首形式是變數先加1然後執行表示式,而字尾形式則是先執行表示式然後再使變數加1,所以在執行字尾的 運算子時應先反回物件的原始值,然後才對物件加1。2 預設的帶有一個引數的 運算子函式是字首 運算子,要過載字尾的 運算子必須採用另一種方式實現。過載字尾的 運算子時應給函式多...
c語言關於運算子的問題
在前九先執行j後在加,比方j 1 1 j 則先是1 j,當然1 j 2了,然後是執行j 這時j 2了,如果是1 j j的話,結果就改是1 1 2 4了,你推敲下是不是這樣 int m,j 5,t t j j j j 6 6 8 8 這裡我用vs2005編譯的是28,9,和你的26,9部一樣,這個可能...