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

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

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 如何開闢空間,在C 中如何釋放NEW開闢的空間

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

C 棧記憶體是怎麼分配的,C C 記憶體分配方式 堆和棧的區別

你是在vc的debug狀態下bai執行的。duvc在debug狀態下,會給每zhi個棧變數的前後都dao插入4個位元組的保護內值 0xcccc。這樣,乙個容int型本身4位元組,加上前後各4位元組的保護值,一共占有12個位元組。保護值的目的是讓vc系統在debug狀態下,分析你的賦值語句是否越界。如...

c中主函式中new出來了類物件請問在其他

當然可以啊,返回物件指標然後傳遞到其他子函式中就行。你如果老是 函式頭 之類的,就對.h hpp之類的檔案很難理解。實際上是這樣的,乙個project是分編譯 成為obj中間格式 聯接 exe檔案 兩個步驟的,乙個project可以有多個模組組成,這些模組可以是自己乙個人做.不能直接用,需要通過指標...