c delete運算子的問題

2022-12-12 20:45:27 字數 4832 閱讀 3285

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部一樣,這個可能...