[問題] 除錯 使用到相同記憶體位置的Code

看板C_and_CPP (C/C++)作者時間13年前 (2012/10/17 21:50), 編輯推噓1(1016)
留言17則, 6人參與, 最新討論串1/1
int main() { Employee programmer("John",22); cout << programmer.getName() << endl; //Lots of code .... Employee manager = programmer; //Creates a new Employee "manager", //which is an exact copy of the //Employee "programmer". return 0; } 請問這段Code執行後會發生Exception 是不是Programmer 跟 Manager是相同的記憶體位置 之後其中一個物件執行完就釋放掉(Programmer先執行完) 之後Manager也被釋放掉 所以在呼叫時也就錯誤了 請問我這樣觀念正確嗎? 還是其實有誤解的地方 麻煩指正了 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.156.3

10/17 22:02, , 1F
能不能把完整的程式碼 PO 上來?
10/17 22:02, 1F

10/17 22:04, , 2F
BTW,我想你可能有一些誤解。
10/17 22:04, 2F

10/17 23:06, , 3F
若你的Employee有做 operator overloading = 而且寫好的話
10/17 23:06, 3F

10/17 23:07, , 4F
才會達你想要的效果,以目前的程式來看,很可能不是這樣
10/17 23:07, 4F

10/17 23:07, , 5F
Programmer與Manager變數看起來都不是pointer或reference
10/17 23:07, 5F

10/17 23:08, , 6F
所以不會有上述先後釋放的問題
10/17 23:08, 6F

10/17 23:59, , 7F
@mikesun : 當裡面的成員是 char * name, 用 new/malloc
10/17 23:59, 7F

10/17 23:59, , 8F
然後又沒做 constructor 的時候,這時就 double delete..
10/17 23:59, 8F

10/18 00:00, , 9F
( 我只是想說還是要看碼最準,現在都是蝦子摸象 )
10/18 00:00, 9F

10/18 00:01, , 10F
copy function有寫嗎?
10/18 00:01, 10F
SORRY 完整code如下: #include <iostream> using namespace std; class Employee { public: Employee(char *name, int id); ~Employee(); char *getName(){return _name;} //Other Accessor methods private: int _id; char *_name; }; Employee::Employee(char *name, int id) {_id = id; _name = new char[strlen(name) + 1]; //Allocates an character array object strcpy(_name, name); } Employee::~Employee() { delete[] _name; } int main() { Employee programmer("John",22); cout << programmer.getName() << endl; return 0; } ※ 編輯: pugboy 來自: 140.115.156.3 (10/18 09:36)

10/18 09:46, , 11F
dtor、copy-ctor、operator= 這三個東西是三位一體
10/18 09:46, 11F

10/18 09:47, , 12F
你寫了其中一個,通常就代表另外兩個也要寫
10/18 09:47, 12F

10/18 09:47, , 13F
你的觀念有點錯,是不是同一塊記憶體,印出來就知道了
10/18 09:47, 13F

10/18 09:47, , 14F
http://ideone.com/I24Ir 看懂這隻程式輸出就會知道問題
10/18 09:47, 14F

10/18 09:48, , 15F
關鍵其實就是大家都講的,你要寫正確的copy constructor
10/18 09:48, 15F

10/18 09:48, , 16F
以及正確的 operator= 就可以避免這個問題
10/18 09:48, 16F

10/18 09:56, , 17F
還是別指到同一個記憶體,容易炸掉啊
10/18 09:56, 17F
文章代碼(AID): #1GVhUO-h (C_and_CPP)
文章代碼(AID): #1GVhUO-h (C_and_CPP)