1. 程式人生 > >C++類中的指標成員和拷貝建構函式

C++類中的指標成員和拷貝建構函式

對C++程式設計師來說,編寫C++程式有一條必須注意的規則,就是類中包含了一個指標成員的話,那麼 就要小心拷貝建構函式的編寫, 因為一不小心,就會出現記憶體洩漏。 看下面的例子: #include <iostream> class HasPtrMem { public: HasPtrMem() : d(new int(0)) {} //拷貝構造,從堆中分配記憶體 HasPtrMem(const HasPtrMem& value) : d(new int(*value.d)) ~HasPtrMem() { delete d; } int * d; private: }; int main() { HasPtrMem a; HasPtrMem b(a); std::cout << *a.d << std::endl; std::cout << *b.d << std::endl; } 按照C++的語法,這回呼叫HasPtrMem的拷貝建構函式,而這樣的構造有一個問題,就是a.d和b.d都指向了同一塊堆記憶體。因此在main作用域結束時,a和b的解構函式紛紛被呼叫,當其中之一完成後(比如b.d),那麼a.d就成了一個懸掛指標,在這個懸掛指標上釋放記憶體就會造成嚴重錯誤。 C++將這種拷貝稱為:“淺拷貝”。所以通常最佳的解決辦法是使用者自定義拷貝函式實現“深拷貝”。 一個經典面試題,作對了年薪十萬就是你的。