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. 分布式架构中,怎么保证数据的一致性
-
定义
在分布式架构里,数据会分散存储在多个节点上,由于网络延迟、节点故障等因素,数据可能出现不一致的情况。保证数据一致性