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