class base {
public:
base(int *a) : p(a) {}
base(int num) : p(new int(num)) {}
base(base& mid) : p(mid.p) { // 淺拷貝:直接複製指標值
cout << "base is constructing!\n";
}
~base() {
if (p != NULL) {
delete p;
p = NULL;
}
}
private:
int *p;
};
int main() {
base one(1); // p 指向新配置的 int(1)
base two(one); // 淺拷貝:two.p 指向同一記憶體位址
} // two 先解構 delete p,one 再解構 delete 同一位址 → double free
複製建構函式 base(base& mid) : p(mid.p) 僅複製指標值(淺拷貝),導致兩個物件擁有相同的指標 p。當物件銷毀時,析構函式各自 delete p,第二次釋放已釋放的記憶體即觸發 double free(野指標錯誤)。
base(const base& mid) : p(new int(*mid.p)) { // 配置新記憶體並複製值
cout << "base is constructing (deep copy)!\n";
}
若類別管理動態資源(裸指標、檔案控制代碼等),必須實作:
operator=std::unique_ptr、std::shared_ptr 管理資源,編譯器自動生成正確的移動語意,避免手動實作錯誤。base(const base&) = delete;#include <memory>
class base {
std::unique_ptr<int> p;
public:
base(int num) : p(std::make_unique<int>(num)) {}
// 編譯器自動生成移動建構/指派,禁止複製
base(base&&) = default;
base& operator=(base&&) = default;
base(const base&) = delete;
base& operator=(const base&) = delete;
};