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++
沒有留言:
張貼留言