當且僅當類滿足以下所有條件時,可安全依賴編譯器生成的預設拷貝構造函數、拷貝賦值運算符(C++11 含移動語義):
std::string、std::vector、std::shared_ptr)。| 場景 | 問題 | 對策 |
|---|---|---|
含 int* p = new int | 雙重釋放、記憶體洩漏 | 改用 std::unique_ptr 或實現深拷貝/刪除拷貝 |
含 FILE* / HANDLE / socket | 資源重複關閉/洩漏 | 封裝 RAII 包裝器或刪除拷貝 |
| 多態基類 | 物件切片 | 刪除拷貝,提供 virtual clone() |
含 std::mutex / std::thread | 不可拷貝 | 類自動刪除拷貝,無需額外操作 |
=default/=delete 顯式控制)。class Base {
public:
virtual ~Base() = default;
Base(const Base&) = delete;
Base& operator=(const Base&) = delete;
Base(Base&&) = delete;
Base& operator=(Base&&) = delete;
virtual std::unique_ptr<Base> clone() const = 0;
};
=delete 明確禁用拷貝,比私有未實現更清晰、編譯期報錯更早。<memory>、<vector>、<string> 等標準庫源碼,理解其如何正確實現拷貝/移動。掌握「資源管理即物件生命週期(RAII)」核心思想,拷貝/賦值安全性判斷即成直覺。