1. C++ 的拷貝構造函數,深拷貝和淺拷貝
-
定義
- 拷貝構造函數:在 C++ 里,拷貝構造函數屬于特殊的構造函數,其功能是使用一個已存在的對象來初始化一個新對象。當對象以值傳遞的方式作為參數傳給函數、函數返回對象、用一個對象初始化另一個對象時,拷貝構造函數會被調用。
- 淺拷貝:僅復制對象的成員變量值。要是成員變量包含指針,僅僅復制指針的值,也就是兩個對象的指針指向同一塊內存區域。
- 深拷貝:不但復制對象的成員變量值,當遇到指針類型的成員變量時,會另外開辟一塊新的內存空間,接著把原指針指向的內容復制到新的內存空間。
淺拷貝實現起來較為簡單,但是存在內存管理方面的風險,例如一個對象銷毀時釋放了內存,另一個對象的指針就會變成野指針。深拷貝能夠避免這種問題,不過實現起來更復雜,需要額外的內存分配和數據復制操作。
-
要點
- 淺拷貝實現簡單,但可能引發內存問題。
- 深拷貝能保證對象獨立性,但開銷較大。
-
應用
在實際開發中,若對象包含動態分配的內存,通常需要使用深拷貝來避免內存錯誤。比如在圖形處理程序里,每個圖形對象可能包含指向圖像數據的指針,使用深拷貝可以確保每個圖形對象有自己獨立的圖像數據副本。
C++ 代碼示例
cpp
#include <iostream>
#include <cstring>class MyClass {
private:char* data;
public:// 構造函數MyClass(const char* str) {data = new char[strlen(str) + 1];strcpy(data, str);}// 淺拷貝構造函數MyClass(const MyClass& other) {data = other.data; // 只復制指針}// 深拷貝構造函數MyClass(const MyClass& other, bool deepCopy) {if (deepCopy) {data = new char[strlen(other.data) + 1];strcpy(data, other.data);} else {data = other.data;}}// 析構函數~MyClass() {delete[] data;}void printData() {std::cout << data << std::endl;}
};int main() {MyClass obj1("Hello");MyClass obj2(obj1, true); // 深拷貝MyClass obj3(obj1); // 淺拷貝obj1.printData();obj2.printData();obj3.printData();return 0;
}
2. 分布式架構中,怎么保證數據的一致性
-
定義
在分布式架構里,數據會分散存儲在多個節點上,由于網絡延遲、節點故障等因素,數據可能出現不一致的情況。保證數據一致性