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++將這種拷貝稱爲:“淺拷貝”。所以通常最佳的解決辦法是用戶自定義拷貝函數實現“深拷貝”。

一個經典面試題,作對了年薪十萬就是你的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章