一.newchar與delete問題
1. 問題程式
[cpp] view plaincopy
#include
using
namespace
std;
void
main()
2. 錯誤
當執行到delete時,程式出錯! 3
. 解答
v1你用new申請了乙個char空間,把它的位址儲存在了des這個指標裡面
然後你又把
"testing!"
這個常量字串的位址賦給了des這個指標
於是,你之前用new申請的那個空間就丟失了,在程式結束系統**全部記憶體前,那個空間就被標明被你使用但實際上你已經丟失它的位址沒辦法再使用它了,這就是最常見的記憶體洩露
delete出錯理所當然,因為你delete的不是你new的那個空間。甲被乙騙了錢不能去法院起訴丙,丙是無辜的 v2
1.char* des = new
char
();應該只分配乙個byte的空間,而後面的des = "
testing!
";我猜樓主的意圖是要將"
testing!
"放入des所指向的空間,很顯然實際上是放不下去的。之所以輸出有沒有問題,是剛好將"
testing
"的首位址給了des,這就改變des的值,也就是des = "
testing!
"中的des,和前面的char* des = new
char
();已經不同了。 4
. 正確**
v1[cpp] view plaincopy
#include
using
namespace
std;
void
main()
v2 嚴格版
[cpp] view plaincopy
#include
using
namespace
std;
void
main()
二.newint與delete
1. 程式
[cpp] view plaincopy
#include
using
namespace
std;
void
main()
for (int i=0;i<2;i++)
delete a;
//二維整型指標
int **b = new
int *[2
];
for (int i=0;i<2;i++)
for (int i=0;i<2;i++)
} for (int i=0;i<2;i++)
printf("\n
");
} for (int i=0;i<2;i++)
delete b;
system(
"pause
");
} 2
. 程式執行正常
除char以外的基本資料型別,在進行指標釋放時一般不用考慮太多,主要是因為沒有字串的賦值(實質是位址的賦值)。
三.小結
在new的型別中,涉及到位址賦值,要千萬小心!
四、使用陷阱
new和delete成對使用,避免記憶體洩露,申請記憶體陣列時使用的
""而非「()」。如下:
char * szdata=new
char(100
); (錯誤)
char *szdata=new
char[100];(正確)
int**a = new int*[2];for(int i=0;i<2;i++)
}for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
cout<<"a["<
c 中new與delete的過載
對於有一定程式設計基礎的人來說,new與delete一定會非常的熟悉,知道在使用的過程中 new 先分配memory 記憶體 再呼叫ctor 建構函式 而delete是先呼叫dtor 析構函式 再釋放memory。int p new int 10 int pa new int 10 new用來動態建...
C 中的new與delete總結
標準庫提供的global operator new,在全域性名字空間中定義 void operator new std size t size 丟擲異常的版本 void operator new std size t size,const std nothrow t nothrow value no...
C 中的new語義與delete
籠統地說,c 中的new就是申請一塊記憶體,但是對於不同型別的資料,要注意的點也不同。new與基本資料型別,如int new與陣列 new與物件 new的替換語義 new最好與智慧型指標配合使用,防止記憶體洩漏 申請乙個int型資料a int a newint 2 delete a 申請乙個大小為1...