C 中new分配記憶體的問題,C 動態分配記憶體 記憶體洩漏問題 new

2021-06-25 14:44:04 字數 2840 閱讀 5772

1樓:匿名使用者

這樣是會有記憶體洩漏的,因為第一次執行s = new stu; 後,系統申請了一塊新的記憶體空間(型別為stu),並把其地址賦給s

第2此執行s = new stu後,系統又申請了一塊新的記憶體空間,並把其地址賦給s,此時把s原來的值覆蓋掉了,也就是第一次申請的記憶體空間的地址丟失了

而delete s; 只是把現在s指向的記憶體中的變數刪除,這就把第二次申請的變數刪除了,但是這樣並不能將第一次申請的變數刪除,因為其地址已經丟失掉了

就算你執行兩次delete語句也是沒有用的,這樣就算編譯器不報錯,執行程式的時候都會報錯,因為你刪除了同一個地址兩次

2樓:

第一次new的記憶體未釋放。

每一次new返回分配的記憶體地址放在s裡面,假設地址值為a,大小為sizeof(stu)

第二次new同樣分配了一個大小為sizeof(stu)的記憶體,地址假設b。

再delete s,系統根據你提供的地址s,只把後一次分配的地址b所在的大小為sizeof(std)的記憶體釋放了,前面的分配的記憶體a就洩漏了。

3樓:

不是明白著的嗎?肯定洩漏了,申請了兩個,只釋放了一個!!!

4樓:咴忻

你跟蹤一下吧,如果s的地址變化了就會發生洩漏

5樓:

上面說得都對,我就不重複了

6樓:匿名使用者

哈哈,五樓的例子好形象啊,我頂啊!!

7樓:利芳懿邶豆

樓上的正解,補充下,記憶體分配都有個最小值,它和你制定的位元組數不一定相等,一般會分配頁對齊的區域,比如你分配一個位元組,但實際上卻是分配了128個位元組(假設記憶體分配的最小單位是128位元組)

c++ 動態分配記憶體 記憶體洩漏問題 new

8樓:匿名使用者

可以,只要對相同地址new和delete配對使用都會正確**記憶體。更好的辦法是使用智慧指標unique_ptr和shared_ptr。

9樓:無非灬依舊

可以解決,因為申請的指標q已經指向了p申請的這個int例項,delete的話就是把這個動態分配的空間給釋放掉,所以這種方式是可以解決這裡的記憶體洩露問題。

c++中給結構體分配動態記憶體的問題……用new嗎 怎麼用?

10樓:非常可愛

c++中給結構體分bai配動態du記憶體是用new。

示例:struct mystruct

mystruct *pmysrt=new mystruct;

pmysrt->a=1;

pmysrt->b='a';

cout

擴充套件資料zhi

c++中new的用法

dao1、呼叫operator new分配記憶體,operator new (sizeof(a)) ;

版2、呼叫建構函式生成權類物件,a::a() ;

3、返回相應指標 ;

4、分配記憶體這一操作就是由operator new(size_t)來完成的,如果類a過載了operator new,那麼將呼叫a::operator new(size_t ),否則呼叫全域性::operator new(size_t ),後者由c++預設提供。

11樓:匿名使用者

直接new就可以bai了,不過c結構du

體如果定zhi義在.h檔案dao裡,最好回加上,避免出答錯#ifdef _cplusplus

extern "c"pos;

#ifdef _cplusplus

}#endif

pos *p = new pos;

delete p;

12樓:匿名使用者

注意c++和c的函式

bai庫不同喵~

realloc 只是du “從操zhi作dao系統中分配記憶體給回當前程序”

new 預設答包含“從作業系統分配記憶體給當前程序,並使用建構函式初始化該記憶體區域” 兩個操作。

如果只是想要在c++裡面編譯通過,加上 extern "c" {} 關鍵字註釋c**塊即可喵。

13樓:小忍and奏

void buildstack(stack *s){(*s).base=(m*)new((&(*s).base) sizeof((*s).

base))char[((*s).stsize 100)*sizeof(m)];

……bai

new(地址du)型別[大小

zhi]

delete &(*s.base) //釋放dao應該

內是這樣容吧

14樓:

比如:pos *p;

p=new pos;

if(!p)

p->i=3;

p->=i*i;...

15樓:匿名使用者

可以用new和delete,和使用普通變數一樣

16樓:粟筠項奇思

c++中是沒有結構抄體的,從baic繼承來的struct已經變成類了,而不再du只是一個zhi結構體,直接new就可以了。dao

#include

struct

myclass

;myclass::myclass(intarg)

myclass::myclass()

void

myclass::show()

C語言 動態記憶體分配

p1 int malloc 10 sizeof int 就是生成了一個動態陣列啊 而且c語言裡p x 實際上就等價於 p x 只要p是指標型別的變數,不管它是陣列,還是其他什麼,都不會報錯 malloc函式的實質體現在,它有一個將可用的記憶體塊連線為一個長長的列表的所謂空閒連結串列。呼叫malloc...

C動態生成的Label設定屬性c中動態生成多個label控制元件

this.label1 new system.windows.forms.label new一個物件 this.label1.location new system.drawing.point 40,352 位置 this.label1.name label1 變數名this.label1.tabi...

C 如何開闢空間,在C 中如何釋放NEW開闢的空間

你第二行申請了5個int的空間,裡面存了東西,那麼你又增加了5個空間,那麼你需要一箇中轉的指標,用新建的中轉指標開闢10個空間,然後把原有空間中的內容存到新開闢的空間中,delete掉原來申請空間,之後在讓原來指標指向新申請空間,然後將中轉指標置null。這樣就變成你所要求的內容了 這是我該的程式 ...