C++類中的指標成員和拷貝建構函式
阿新 • • 發佈:2019-01-31
對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++將這種拷貝稱為:“淺拷貝”。所以通常最佳的解決辦法是使用者自定義拷貝函式實現“深拷貝”。
一個經典面試題,作對了年薪十萬就是你的。