c如果類中有指標資料成員,而我沒有用new析構

2022-03-08 22:02:20 字數 1746 閱讀 1168

1樓:

變數實際佔用的記憶體分兩種分配情況:

一種在棧(stack)上分配,直接宣告變數就是在棧上分配的、無法通過new來在棧上分配,無需delete

一種是在堆(heap)上分配,通過new等方式分配,需要delete

1)如果類中有一個指標資料成員,而我沒有用new, 解構函式要不要delete?

不需要。

2)類中的那些int, char之類的, 為什麼都不用delete, c++是自動把他們佔得記憶體給釋放掉了嗎?

類物件在分配的時候,就連同內部的int、char這些變數也分配記憶體了,類物件釋放的時候、這些變數也會隨著釋放。

當類物件在stack上分配,那就沒有什麼需要特別處理的。

當類物件在heap上分配,只要delete掉類物件,這些int、char變數也就跟隨著釋放掉了。

2樓:歌夢復興

不用,delete必須要和new配套使用。int,char的記憶體是使用的堆疊記憶體,而new出來的物件是儲存在堆記憶體,堆記憶體的申請和釋放是由程式設計師自己操作的;堆疊記憶體中的資料只要生命週期結束了會自動釋放,不用自己去delete的。

3樓:

開闢變數生成在堆區,要自己釋放,不然倒置記憶體洩露!開闢變數在棧,在它的scope(存活區域)外,系統自動釋放。c++中的物件都是在堆區的。

類成員隨著物件的delete而消失。而臨時變數時過了生存週期就掛了

4樓:閃閃紅紅星

delete 和new是成對使用的,你沒new,當然不需要delete。

是的,你說的int,char之類是在執行棧中存放的,c++自動釋放他們的記憶體。

5樓:小何才露尖尖角兒

c++ 如果類中有一個指標資料成員,而你沒有用new, 解構函式是不用delete的?在類中,int char 這些只要不是new的,也同樣不用釋放,系統會自動把他們佔的記憶體釋放掉,只有new 的才會手動的去delete。int char ,這些基本型別,是區域性變數,存在於棧上。

而一個指標定義的時候,也是在棧上比如int *p;p在棧上,而且p的值也是棧的一個地址。但是當int *p = new int ;這時候,p這個變數是在棧上的。但是p的值是一個地址,這個地址是堆上的一個地址。

如果不delete p;那麼,這個地址會一直被佔用著,不能被其他的物件所使用,所以我們用完這個地址,要把這個地址釋放掉。不知道你懂了沒有,不懂的再追問。

c++建構函式中使用new,解構函式用delete刪除,出錯

6樓:匿名使用者

所以說帶指標成員的類一定要定義拷貝建構函式,否則預設拷貝建構函式會直接對指標拷貝地址,這樣 出現a3.add(a1,a2); 這樣a1,a2在函式中生存的臨時變數釋放指標時將本來的a1,a2的指標空間也釋放了,因為是地址拷貝,臨時變數跟原來的物件中的指標成員是用一個地址,加上自定義的拷貝建構函式就好了:

void minus(matrix a, matrix b);

rows=rhs.rows;

int i,j;

cols=rhs.cols;

p=new int*[rows];

for(i=0; i

注意你的解構函式也是錯的:

~matrix()             //解構函式{int i;

for(i=0; i

c語言指標,輸入a,b,c數。將最大的數輸出

上面兄弟的程bai序在duvc6.0裡雖然編譯和連線都沒什麼問題zhi,但是是得不出dao正確結果的,輸入版11,12,13只會顯示11.這顯權然是不正確的.錯誤之處是下面這句 scanf d d d a,b,c 應為少了3個逗號.以下是小弟寫的 在vc6.0下除錯通過 include void s...

C 中a是char指標如果char a bcda與a 以及 a結果會有什麼不同呢

a 和 a 是一抄樣的,優先順序高於 所以a是和 連在一塊的,和有沒括號沒關係,因為是後 所以a在這個表示式中的值是它的當前值,在這個表示式求值完畢後,才執行a a 1,這個次序和優先順序是兩回事 同樣的道理 a和 a 也是一回事,前 的特性使得a在這個表示式中的取值是a自增一次後的值,也就是說在表...

C中,編寫函式,輸入整數,利用指標返回該數的絕對值

include int mabs int a,int p int main c 是c語言的繼承,它既可以進行c語言的過程化程式設計,又可以進行以抽象資料型別為特點的基於物件的程式設計,還可以進行以繼承和多型為特點的物件導向的程式設計。c 擅長物件導向程式設計的同時,還可以進行基於過程的程式設計,因而...