C++——深浅拷贝

43 阅读1分钟

一、浅拷贝和深拷贝 9

浅拷贝 = 复制指针,深拷贝 = 复制指针 + 复制内容

多数情况下:

  • 编译器进行的拷贝(浅拷贝)
  • 程序员进行的拷贝(深拷贝)

代码示例 1 (浅拷贝):

class MyClass {
public:
    int* data;
    MyClass(int value) {
        data = new int;
        *data = value;
    }
    // 默认拷贝构造函数 (浅拷贝)
};

int main() {
    MyClass obj1(10);
    MyClass obj2 = obj1; // 浅拷贝

    std::cout << *obj1.data << std::endl; // 输出: 10
    std::cout << *obj2.data << std::endl; // 输出: 10

    delete obj1.data; // 释放内存

    // obj2.data 指向的内存已被释放,再次访问会导致错误
    // std::cout << *obj2.data << std::endl; 

    return 0;
}

代码示例 2 (深拷贝):

class MyClass {
public:
    int* data;
    MyClass(int value) {
        data = new int;
        *data = value;
    }
    // 自定义拷贝构造函数 (深拷贝)
    MyClass(const MyClass& other) {
        data = new int;
        *data = *other.data;
    }
    ~MyClass() {
        delete data;
    }
};

int main() {
    MyClass obj1(10);
    MyClass obj2 = obj1; // 深拷贝

    std::cout << *obj1.data << std::endl; // 输出: 10
    std::cout << *obj2.data << std::endl; // 输出: 10

    delete obj1.data; // 释放 obj1 的内存

    // obj2.data 指向独立的内存空间,访问安全
    std::cout << *obj2.data << std::endl; // 输出: 10

    return 0;
}