1. 程式人生 > >C++之模板類(Template) 容器之map 及 物件副本 深/淺拷貝 等問題

C++之模板類(Template) 容器之map 及 物件副本 深/淺拷貝 等問題

例如:假若你沒有提供CFileAttribute::operator=(過載賦值操作符),那麼語句fileAttribute1 = fileAttribute2就相當於:memcpy(&fileAttribute1, &fileAttribute2, sizeof(CFileAttribute))。如果你的CFileAttribute僅包含簡單變數,例如:
class CFileAttribute
{
  int i;
  double d;
};
那麼memcpy沒什麼不妥。但假若你的CFileAttribute中包含(或者巢狀包含)指標,那麼就可能有問題了,因為指標的複製並不等於記憶體塊的複製,因此你必須顯示地提供一個CFileAttribute::operator=,並且在其中把指標所對應的記憶體塊也複製一遍,這才是真正的副本(此時這兩個副本內的指標反而是不相等的,因為分別指向不同的記憶體塊),其中任何一個副本的銷燬(一般會在解構函式中把其指標所指向的記憶體塊同時銷燬)都不會影響到另一個副本的獨立存在,既採用的是深拷貝(詳解參看深拷貝與淺拷貝
)。

你的CFileAttribute::m_str顯然是CString型別,而CString內部當然是一個指標,因此預設的、memcpy方式的拷貝建構函式以及賦值操作符一定會出問題。你必須顯式提供自己的拷貝建構函式以及賦值操作符。