網頁

2013年5月3日 星期五

C++ new class or not

Last Update: 2013/05/03 18:39+08


Intro

關於使用Class時, 要不要 "new" 一個出來
本來以為C++的memory都要自己管理
沒想到也有交給別人的時候...
嘛 是我太弱了

就是下面2行的差異
MyClass temp1;
MyClass *temp2 = new MyClass();


Content


以下是測試程式
 class MyClass{

public:
 float a0, a1,a2,a3,a4,a5,a6,a7,a8,a9;
 float b0, b1,b2,b3,b4,b5,b6,b7,b8,b9;
 float c0, c1,c2,c3,c4,c5,c6,c7,c8,c9;
 float d0, d1,d2,d3,d4,d5,d6,d7,d8,d9;
 float f0, f1,f2,f3,f4,f5,f6,f7,f8,f9;
};


MyClass getMyClass(MyClass **ptr){

 MyClass t1;
 t1.a0 = 100;
 printf("t1 address: %lu\n", &t1);

 for (int i=0;i<10000;i++){
  MyClass t2;
  t2.a0 = 101;
  *ptr = &t2;
 }
 printf("t2 address: %lu\n", *ptr);

 return t1;
}//#4 local variable will destroyed


int _tmain(int argc, _TCHAR* argv[])
{
 //no "new"
 for(int i=0;i<10000;i++){
  MyClass temp;
  temp.a0 = 10;
 }getchar();//#1 App Memory: 444k (temp is destroyed)

 //"new" and "delete"
 for(int i=0;i<10000;i++){
  MyClass *temp = new MyClass();
  temp->a0 = 11;
  delete temp;
 }getchar();//#2 App Memory: 444k (temp is destroyed)

 //"new" and no "delete"
 for(int i=0;i<10000;i++){
  MyClass *temp = new MyClass();
  temp->a0 = 12;
 }getchar();//#3 App Memory: 3024k (temp is not destroyed)

 
    //#5
 MyClass *t2;
 MyClass t1 = getMyClass(&t2);
 printf("t1 address: %lu ; %f \n", &t1, t1.a0);
 printf("t2 address: %lu ; %f \n", t2, t2->a0);

 getchar();
 return 0;
}

#1 的地方, 並沒有去 new 一個class
在離開 for (scope) 以後會被清除
因此 memory 並沒有上升 (444k)

#2, 有執行 delete
所以 memory 也沒有上升 (444k, 廢話!)

#3, 沒有執行 delete
因此 memory 上升到 3024k

所以結論是
如果你是在 function (#4) 裡, 做為 local variable 使用
你可以不去"new"它, 不用去在乎 memory 管理, 它會被destroy
可是 如果你一旦使用 new, 不執行 delete, 即使離開 scope 也不會被清掉

#5 的地方
根據 Scope and return values in C++ 這篇Q&A提到
return value 會被另外 assign
所以我們在 function 裡 宣告物件 t1 的 addres, 與 接收到時不一樣
但 t2 這是我不太瞭解的, 如果做為 local variable, 卻將其pointer回傳
這時 function 裡 和 外 的 address 是一樣的, 那我仍可以用 t2 嗎?
應該找篇 C++ 運作原理之類的來看看了 囧rz


Reference


When to use “new” and when not to, in C++?
Scope and return values in C++

沒有留言:

張貼留言