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

2021-06-25 14:44:03 字數 2840 閱讀 9634

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嗎 怎麼用

不能訪問是不能直接通過派生類物件直接呼叫,但是可以通過派生類的成員函式呼叫基類的公有函式來訪問基類的私有屬性.難道編譯器會分配一塊記憶體放著不管造成記憶體洩漏?因為在派生類中通過可以定義新函式成員來訪問這些記憶體 間接訪問 比如呼叫基類派生下來的成員函式 所以這些記憶體是可以被主動訪問或銷燬的。私有...

C語言,記憶體管理問題,C語言問題 記憶體的分配方式有哪幾種?

一樣大。name是char指標型別,它只記錄地址,不記錄地址裡面存的東西所以不管存多少東西,地址的長度是不會變的。這個sizeof struct mm的長度目測是8 在32位程式裡 變數定義之後,就會給變數分配空間了,不管你有沒有給它賦值。32位系統下,sizeof struct mm 為8位元組,...

c 動態記憶體分配一維陣列,C 動態建立一個一維陣列 ,賦值 並顯示每個元素的值,最後釋放記憶體

你的兩個疑問 1 分配記憶體大小如何確定 2 動態分配記憶體後初始值是啥東西 給你一個簡單的解決方案例子 1 定義一個函式,兩個引數,引數1 指向記憶體的指標 引數2 記憶體的大小 2 為你分配的記憶體做初始化消除不確定性 之所以要用到動態記憶體分配,是你一開始不知道要分配多大的記憶體空間,但最後要...