c 中,用new了兩個變數a,b,然後a b,最後delete時出問題

2023-02-17 13:00:31 字數 5578 閱讀 7004

1樓:篤俠

1 如果a,b都指向動態分配的記憶體,一般不要執行a=b這樣的操作,如果確有必要這麼做,可以先將a儲存在別處。比如 int *c=a; a=b; 這樣a,b所指向的記憶體以後都能釋放。

2 一指標所指記憶體被釋放以後,應緊接著將其置空。比如 delete a; a=0; 這樣,一方面可以避免誤用a而引發錯誤,另一方面,也能知道a是否已經釋放了。

2樓:點趣生活

你這個寫法已經出現記憶體洩露了,b用a去賦值,b之前指向的記憶體地址已經丟失了,a和b同指向一個地址,所以無論你delete a在前還是在後,這裡一定會出問題的。

如果要知道b原先的地址,你這裡只能再借助另外一個臨時變數去存了。

3樓:匿名使用者

1. 無法判斷,首先你就不能直接a=b,必須等delete a之後才能把 b賦值給它,其次,你每次delete a或者delete b之後,必須加一句a= null;否則你永遠無法判斷

2. 無論你執行delete b還是不執行,你總有空間沒法釋放,原因在於b=a已經把 b原來擁有的空間弄丟了,這就是常見的「記憶體洩露」

4樓:

開僻了空間就必須有守護那塊空間,在釋放b指向的記憶體之前你讓b離開了它守護的區域這是很不正確的,b指向的記憶體就不能釋放了,這叫記憶體洩漏,禁止!!

5樓:匿名使用者

你已經丟失了b指向的記憶體的地址,再也找不會來了,這種現象被稱為記憶體洩露,在程式設計時要防止記憶體洩露

6樓:匿名使用者

if(a!=null)

如果這樣定義

a=new int[1];

b=new int[1];

delete的是時候需要

delete a;

delete b;

b=a;指標不要隨意改變

7樓:律映陽

看effective c++ 裡面講解吧,就是智慧指標的問題,一般用reference counting的策略

8樓:匿名使用者

我是過來學習的,嘿嘿。ls解釋很詳細。

c++new操作符的問題 例如a,b是兩個類,那麼a* m = new b這個句子是怎麼呼叫a,b

9樓:匿名使用者

如果a是b的基類(只有基類指標或引用可以指向本類及其派生類)那麼先會構造基類;

即先呼叫a的建構函式

再呼叫b的建構函式

10樓:額外覆蓋

你這個的前提是a類要是b類的基類

類在呼叫建構函式時會先呼叫其基類的建構函式,就像蓋樓從下往上

有a b兩個變數,要求不使用第三個變數,交換a b的值,用c語言這麼寫?

11樓:兩廂遺忘

a=a+b這個得到的是a和b的和;也就是這一步執行之後當前的a的值就是a,b之和。

b=a-b,既然a是他們兩個的和,那麼a-b得出的肯定是最初的a的值;這一步執行之後,b的只就是原始a的值;

a=a-b,既然b是原始a的值,a是原始a和原始b的和,那麼差值肯定就是原始b的值。

12樓:匿名使用者

這個完全是算術的方法呀

舉個例子就明白了

我有100塊,你有50塊, 咱倆換

你100先給我,咱倆放一塊就有150了, 我再把去掉你的50的錢給你,就是把我的錢給你了

然後,這堆錢再去掉你的100,剩下的給我,我就拿到了50了

13樓:匿名使用者

a=2 b=3

5=2+3

3=5-2

2=5-3

這樣是不是清楚了

求c++高手寫程式 鍵盤輸入兩個整型變數a、b的值,利用中間變數c交換a、b的值並輸出

14樓:

#include

using namespace std;

void main()

15樓:真好

int main()

16樓:靠你喵了個咪的

#include

using namespace std;

int main()

17樓:du果

void change(int &a,int &b)

c++中可以這樣嗎? int *a = new int[10]; int *b = new int[10]; delete [] a, b;

18樓:匿名使用者

可以,動態陣列動態分配,new與delete成對出現。

注意,delete a, b;

只有一對中括號。一開始我還以為要在b前面加一對中括號。。。樓主寫的是對的。

19樓:

可以,定義的指標指向陣列地址

20樓:舒城俠們

不可以 應該deletea; delete b;

c++中,什麼時候用 a a;和什麼時候用a a=new a;

21樓:黃邦勇帥哥哥

下面給你詳細介紹一下動態分配記憶體new關見字的使用方法,希望看了之後你能全現瞭解什麼時候可以使用new以及怎樣使用new,以下內容全面,簡單易懂,是完全出自本人的學習總結,絕非複製。

動態分配記憶體new關見字

1. 全域性物件和區域性物件的生命期都是嚴格定義的,程式設計師不能以任何方式改變他們的生命期。但是有時候需要建立一些生命期能被程式設計師控制的物件,他的分配和釋放可以根據程式執行中的操作來決定。這時就需要使用new操作符了。

2. 動態分配記憶體,將從堆中分配記憶體,動態分配的儲存區是在執行時確定的,動態分配的儲存區可以隨著需求而自動擴大.

3. 區域性變數一般儲存在堆疊中,堆疊是先進後出的儲存結構,而堆卻不是.

4. 在c++中使用new動態分配記憶體,delete釋放以前new分配的記憶體.

5. 使用new運算子系統將從空閒儲存區中為物件分配記憶體,並返回一個指向該物件的指標即該物件的地址。new運算子的特點是:用new運算子分配的物件沒有名字,對該物件的操作都要通過指標間接地完成操作。

例如new int,就是從空閒儲存區分配了一個int型物件,但沒法對這個物件進行操作,只是從儲存區分配了這麼一個空間。語句int *p=new int表示從空閒儲存區分配一個int物件並把這個物件的地址賦給p,現在p就是用new分配的int物件的地址,而*p就是那裡的值。語句int i;int*p=&i;和int *p=new int都是將int變數的地址賦給了指標,但不同的是前句可以用名稱i和*p來訪問該int型變數,而後句則只能用*p來訪問該變數,也就是說p指向的記憶體沒有名稱。

6. 動態建立陣列:int *p=new int [11];建立動態陣列時必須有方括號,且裡面要有建立的維數,但該陣列的第一維可以是一個複雜的表示式。訪問地址中的內容的方法為*p訪問陣列中的第一個元素,p[1]該問第二個元素,以此類推。

建立二組陣列的例子:int (*p)[102]=new int [4][102]。

7. 動態建立物件的初始化:int *p=new int(102)該語句表明由p指向的新建立你物件被初始化為102。動態建立物件的初始化方式為在型別名後面用一對括號來被始化。

8. 動態建立物件的預設初始化:方式為在型別名後面跟一對空的圓括號初始化, int *p=new int (); int *ps=new string(); cls *pc=new cls();第一條語句把物件的值初始化為0,第二條語句對於提供了預設建構函式的string類,不論程式是要明確的不初始化,還是要求進行值初始化都會呼叫預設建構函式初始化該物件。而對於內建型別或沒有預設建構函式的型別,則採用不同的初始化方式就會有顯著不同的差別。

例如:int *p=new int; int *p=new int();第一條語句沒有被初始化,而第二條被初始化為0。

9. 用new動態建立的陣列不能被初始化,不能建立初始化值集。

10.耗盡記憶體:如果程式用完了所有可用的記憶體,new表示式就有可能失敗。如果new表示式無法獲得要需要的記憶體空間,系統將會丟擲名為bad_alloc異常。

11.可以在一個函式內使用new運算子分配記憶體,而在另一個函式中使用delete釋放記憶體空間.delete只能用於釋放前次使用new分配的空間,不要使用delete來釋放不是new分配的記憶體,不要使用delete釋放相同的記憶體兩次,應使用delete 來釋放動態陣列,例如:int *p=new int [10];delete p;刪除陣列必須要有方括號。delete不一定要用於new的指標,例如int *p=new int ; int *x=p; delete x;將是合法的.如果指標的值為0,則在其上作delete操作是合法的,但沒有任務意義。

12.懸垂指標:執行delete p後只是把p所指向的地址的內容給釋放掉了,並沒有刪掉指標p本身,還可以將p重新指向到另一個新的記憶體塊,因此p還指向原來他指向的物件的地址,然而p所指向的內容卻已經被釋放了,因此p不再有效而變得沒有定義了。這樣的指標稱為懸垂指標。

懸垂指標往往導致程式錯誤而且很難檢測出來。

13.靜態聯編:如果通過宣告來建立陣列,則在程式被編譯時為他分配記憶體空間,不管程式是否使用陣列,陣列都在那裡,佔用了記憶體。在編譯時給陣列分配記憶體被稱為靜態聯編。

意味著陣列是在編譯時加入到程式中的。但使用new時,如果在執行階段需要陣列,則建立他,如果不需要,則不建立,還可以在程式執行時選擇陣列的長度,這被稱為動態聯編。意味著陣列是在程式執行時建立的,這種陣列叫做動態陣列,使用靜態聯編時必須在編寫程式的時候指定陣列的長度,使用動態聯編時,程式將在執行時確定陣列的長度。

14.const常量物件的動態分配和**:與其他常量一樣,動態建立的const物件必須在建立時初始化,並且一經初始化,其值不能再修改。例如:

const int *p= new const int(111);刪除方法為:delete p;儘管程式設計師不能修改const物件的值,但可以撤消物件本身。

15.注意:不能在空閒儲存區上建立內建型別元素(除類陣列string外)的const陣列。因為我們不能初始化用new建立的內建型別陣列的元素。

如const int *p=new const int [11];將是錯誤的。

16.注意:如果用new分配了資源,而沒有用delete釋放該資源的話,那麼用new分配的資源將一指被佔用。

17.常見錯誤:如果對某個指標動態分配了記憶體,又把另一個變數的地址付給這個指標,這時這個指標就指向了一個靜態地址,而不是原先的動態地址。如果再用delete刪掉這個指標時就會出錯,因為這時這個指標是指向靜態地址的,不能用delete刪除一個指向靜態地址的指標。

比如int *p =new int(1),這時指標p指向一個動態記憶體可以對他進行delete刪除,但如果再執行語句int a=2; p=&a;這時就改變了指標指向的內容,使原先指向的動態記憶體地址變成了指向現在的靜態記憶體地址,如果這時對指標p進行delete操作就會出錯,因為你在對一個靜態指標靜行刪除,而delete只能刪除動態指標。

例:動態分配物件new

class hyong

hyong(int i) ~hyong() };

int main()

C語言中,怎樣不用中間變數而互換兩個變數的值呢

有兩種方式可以不使用中間變數,交換同型別的變數a,b的值 1 使用加法操作 a b b a b a b 2 使用異或操作 a b b a a b c語言運算子是說明特定操作的符號,它是構造c語言表示式的工具。c語言的運算異常豐富,除了控制語句和輸入輸出以外的幾乎所有的基本操作都為運算子處理。除了常見...

A B是兩個完全相同的物體,物體C與A B體積相等,將它們放

復1 因為物體a b漂浮制,根據漂浮條件可知 它們受到的浮力都等於物體的重力,而a b是兩個完全相同的物體,所以它們受到的浮力相等,即fa fb 因為b漂浮,排開的液體體積小於物體的體積,c物體下沉,浸沒液體中,排開的液體體積與物體的體積相同,而物體c與b體積相等,所以b物體排開的液體體積小於c物體...

用c語言寫輸入兩個整數ab程式設計求解a的b次冪的

include include include include include include include using namespace std string highit string a,string b c for int i n m 1 i 0 i result.insert 0,1,...