在 C++ 中,对象的复制可以通过拷贝构造函数和赋值操作符来实现,这些复制机制包括浅拷贝、深拷贝和写时拷贝(Copy-On-Write, COW),它们对资源管理有着不同的影响。
浅拷贝(Shallow Copy)
浅拷贝仅复制对象的成员变量值。如果成员变量是指针,则新对象的指针会指向与原始对象相同的内存地址。这导致新对象与原始对象共享动态分配的资源。浅拷贝适用于不可变对象或不包含动态分配资源的对象。
深拷贝(Deep Copy)
深拷贝创建新对象时,会对原始对象中的每个动态分配的资源进行副本创建。这样新对象拥有自己的资源副本,不与原始对象共享资源。深拷贝适用于包含指向动态分配资源的指针的对象。
写时拷贝(Copy-On-Write, COW)
写时拷贝是一种性能优化技术,它避免了不必要的复制操作。在写时拷贝中,复制对象时不立即创建资源副本,而是与原始对象共享资源。只有当对象需要修改资源时,才会创建资源的副本。这通常发生在对象的成员函数被调用以修改资源时。写时拷贝通过延迟复制操作提高了性能,但需要仔细管理资源的所有权和生命周期。
以下是深拷贝和浅拷贝的示例代码:
#include <iostream>
class Resource {
public:
Resource() { std::cout << "Resource created" << std::endl; }
~Resource() { std::cout << "Resource destroyed" << std::endl; }
};
class MyClass {
public:
Resource* res;
MyClass() : res(new Resource()) {}
// 浅拷贝构造函数
MyClass(const MyClass& other) : res(other.res) {}
// 深拷贝构造函数
MyClass(const MyClass& other) : res(new Resource(*other.res)) {}
~MyClass() { delete res; }
};
int main() {
MyClass original;
MyClass shallowCopy = original; // 浅拷贝
MyClass deepCopy(original); // 深拷贝
return 0;
}
在这个例子中,浅拷贝构造函数只是复制了指针,而深拷贝构造函数则创建了一个新的 Resource
对象。
C++ 标准库中的 std::string
类采用了写时拷贝机制。当 std::string
对象被复制时,并不会立即复制字符串数据,而是在需要修改字符串时才进行复制,从而在许多情况下避免了不必要的内存分配和复制操作。