關於MFC中的new和delete問題

2025-01-13 05:35:20 字數 4406 閱讀 3000

1樓:網友

小括號是語法規定。這個規定大多是用於函式或過程定義的。括號內的東西是作為引數傳遞給函式使用的。

m_pserialport=new cserialport();這個空的表示不需要引數傳遞。

m_pserialport=new cserialport(12345);=這個傳遞的是乙個數值做為引數。

m_pserialport=new cserialport(「test」);這個傳遞的是乙個字串做為引數。

小括號是沒有什麼特定含義的。它只是用來規範語法以及告訴計算機這傻貨,來,幫哥們傳遞幾個引數。

int* p=new int(5); 這個是賦值5給指標變數相當於乙個函式將引數5初始化後,再傳遞給指標變數p.

int* p=new int[5]; 這個是有錯誤的,int[5]是沒什麼意義的。雖然編譯依然通過,但p^指向的值是隨機的,而不是5.

2樓:網友

這個小括號就是建構函式的括號,與int後面的小括號是相同的,內建型別int long什麼的也可以這麼寫,但int什麼的就不是建構函式了,只是簡單的初始化。

3樓:

道理相同,就是構造乙個對應的物件。

4樓:網友

應該不存在int* p=new int(5); 這種東西。c++新的標準?還是微軟自己的標準?

只有 int* p=new int[5];

下面你的問題。

因為可能有:

class cserialport

public:

cserialport();

cserialport(int num);

cserialport(char *psz);

你可以:m_pserialport=new cserialport();

m_pserialport=new cserialport(12345);

m_pserialport=new cserialport(「test」);

明白了嗎。

在mfc中為什麼我new了物件,但用delete卻總是報錯呢?

5樓:

江半仙 請不要誤導了,delete乙個空指標根本沒有關係,有關係的是delete完這個指標沒有設定為空,那樣就變成乙個野指標了。

我看你給出的程式並不完整,不過我覺得tinyxml應該提供了對應的記憶體管理,只要刪除根或者根本不用delete會自動幫你delete,這點你最好看下tinyxml的幫助。

至於會崩潰的問題建議你還是debug下應該是野指標的問題。

6樓:江半仙

那就可能是你的new運算子操作失敗了。

對於空指標當然不能delete

一般都是呼叫delete之前先對指標進行有效性檢驗:assert(p)/assert_valid(p)之類的。

然後在delete.防止同一物件被delete多次或者對空物件delete

希望對你有所幫助!

7樓:網友

是delete 到第幾個出錯的。

檢查指標是否為空。

為什麼mfc中很多new的物件找不到在哪delete

8樓:網友

你說的new出來的cmainframe其實被儲存到了m_pmainwnd成員中,在關閉程式的時候基類cwinapp會去delete這個棚圓咐成員的。

所以可以看出有些腔森new出來鏈純的物件為了方便使用會讓與它關聯的物件去delete它。

9樓:匿名使用者

有些物件是程式整個生命週期內有效的,這些可以沒有顯式delete

我使用vs2005 mfc程式,是否所有的new都要delete呢?

10樓:網友

所有使用new分配記憶體的物件,都需要進行delete處理,不然會引起記憶體洩漏。這是vs2005的新特性。

沒有通過new建立的物件都不必要用delete。其實在c裡面就已經有這樣的思想了,malloc也要用free釋放不是嗎?

csock usock;

int a;

這些沒有new的不必delete。在當前塊執行完畢後,編譯器它會自動幫你消除。

mfc delete 的使用疑問! 一般情況下,對於動態new出來的記憶體,需要呼叫delete進行析構和將記憶體返回給堆。

11樓:網友

1全部你在這句話 cmybyte(1,2))中由於new返回的是乙個指標對吧,因此mmm中加入的是乙個指標,而非物件,那此時delete p其實是去deleteadd中分配的那個指標所佔的區域,而那個區域並非new的 你不知道去delete的哪個區域,因為那個指標不是在堆疊裡分配的,你去delete堆疊中跟那個指標位址相同的位址的區域,可能那裡剛好被new了 你正好不出錯,但是下次delete的時候可能又剛被new過 這我不是很清楚 但是我相信你沒delete到那個物件。

12樓:網友

你的用法不是標準寫法。

delete p;

p= null;

delete p;//這裡不報異常,為什麼呢?

加上置空那句。

你再試試。

mfc 裡面的 delete 問題

13樓:網友

double **x;x=new double*[4];for(int i=0;i<=4;i++)x[i]=new double[4]。

先delete x[i];//單個元素釋放delete

然後delete x;//陣列釋放用delete

delete x;

使用delete前不用檢查指標是否為null。刪除空指標不會引發錯誤。

用new之類時,使用null對指標進行初始化。目的是,如果不小心在還未用new對該指標進行分配就使用的話,程式會出錯,這樣就可以輕鬆地知道錯誤在**。加了null,迫使指標指向位址為0x00000000,無論讀寫該位址都會出錯,而不做初始化,指標裡的值可能會是個垃圾值,對於這個垃圾值,程式不一定會報錯!

delete後,最好也給指標加null:delete x;x=null;(刪除後再使用也會報錯,同樣可以幫助確定出錯位置)

14樓:鹽水肉西瓜

delete 試試。

如果是刪除陣列,必須用 delete,否則不會釋放整個陣列所佔用的空間。

15樓:魔高丈

delete前先檢查一下變數是否==null,不等再delete

16樓:大鵬

new delete

malloc free

都要成對使用,不要造成記憶體洩露!建議重新檢查**。

mfc關於new的問題

17樓:匿名使用者

指標變數在建立的時候不會自動呼叫建構函式。

所以需要進行new操作。

18樓:匿名使用者

樓主,我也不太確定。 按照功能講 new 是在堆中申請的記憶體。整個程式中都有效的。 第二種是棧中申請的,函式中區域性有效。

19樓:網友

你不new,定義的指標是空指標,沒有指向的內容,不能用。

20樓:網友

恩,在堆上新建乙個cmydoc類的例項,不過使用之後要delete的啊,要不會記憶體洩露的。

21樓:手機使用者

cmainframe* pmainframe ; 這個只是給你一把鑰匙,並沒具體的鎖給你;

cmainframe* pmainframe = new cmainframe;而用new的時候就是給你一把鎖,然後返回一把鑰匙讓你能控制這把鎖。

mfc中關於new的問題

22樓:小八

定義乙個cmydoc類的物件。

關於mfc中delete物件的相關問題。

23樓:網友

cgraph *g=(cgraph *)m_;

這句有問題吧。

getupperbound()返回的是最後乙個元素的下標,怎麼能轉換成(cgraph*)呢。

應改為:cgraph *g=(cgraph *)m_;

24樓:網友

cgraph *g這樣子定義是將g(指標)指向m_;。

而你使用。removeat時,已經將該物件釋放。故再去delete時出錯。

25樓:網友

removeat已經將物件釋放了,再次delete就會出錯。

mfc中關於oldfontdcselectobjectfont的疑問

oldfont 是 dc 的上一個 hfont,這裡只是做一下備份 gdi 太老啦 win7 或以上使用者改用 direct2d 吧 mfc中是什麼意思 oldfont是dc 的上一個 hfont,這裡只是做一下備份 gdi太老啦 win7 或以上使用者改用 direct2d 吧。mfc中呼叫set...

cwinform中new出來的label怎麼編寫點選事件。不要c,是c

要給動態生成的label新增 btnclick事件處理過程 lbl 在c 中,我把 label標籤new到窗體上,怎樣為new出來的每一個標籤新增事件,就是點選它,會彈出標籤上的.用事件 看一點我的 在form1裡面寫一個方法,用來修改label 在form2裡面寫 public delegate ...

關於MFC中裝置環境物件CDC的一些淺顯的問題

1只要存在無效域就會重畫,就有wm paint endpaint 作用就是消除無效域,wm paint 訊息優先順序別很低,系統會將幾個wm paint 無效域疊加,2windows系統最常見的程式,由兩個視窗組成,一個是主視窗,一個是檢視視窗,就是記事本中間白色的部分,檢視視窗在前,蓋住了主視窗,...