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() 你第二行申請了5個int的空間,裡面存了東西,那麼你又增加了5個空間,那麼你需要一箇中轉的指標,用新建的中轉指標開闢10個空間,然後把原有空間中的內容存到新開闢的空間中,delete掉原來申請空間,之後在讓原來指標指向新申請空間,然後將中轉指標置null。這樣就變成你所要求的內容了 這是我該的程式 ... 你是在vc的debug狀態下bai執行的。duvc在debug狀態下,會給每zhi個棧變數的前後都dao插入4個位元組的保護內值 0xcccc。這樣,乙個容int型本身4位元組,加上前後各4位元組的保護值,一共占有12個位元組。保護值的目的是讓vc系統在debug狀態下,分析你的賦值語句是否越界。如... 當然可以啊,返回物件指標然後傳遞到其他子函式中就行。你如果老是 函式頭 之類的,就對.h hpp之類的檔案很難理解。實際上是這樣的,乙個project是分編譯 成為obj中間格式 聯接 exe檔案 兩個步驟的,乙個project可以有多個模組組成,這些模組可以是自己乙個人做.不能直接用,需要通過指標...C 如何開闢空間,在C 中如何釋放NEW開闢的空間
C 棧記憶體是怎麼分配的,C C 記憶體分配方式 堆和棧的區別
c中主函式中new出來了類物件請問在其他