首页 > 其他分享 >3

3

时间:2024-07-29 16:59:10浏览次数:6  
标签: obj1 int ShallowCopy DeepCopy 拷贝 data

在C++中,深拷贝和浅拷贝是两种不同的对象复制方式。它们的区别在于如何处理对象中的动态分配内存和指针成员。

浅拷贝

浅拷贝是指直接复制对象的所有成员的值,包括指针成员。浅拷贝不会复制指针所指向的内存块,而只是复制指针的值。这意味着两个对象共享同一块内存。如果一个对象释放了内存,另一个对象将指向无效的内存地址,这可能导致悬空指针问题和程序崩溃。

示例代码:

#include <iostream>

class ShallowCopy {
public:
    int* data;

    ShallowCopy(int value) {
        data = new int(value);
    }

    // 默认的拷贝构造函数执行浅拷贝
    ShallowCopy(const ShallowCopy& other) : data(other.data) {}

    ~ShallowCopy() {
        delete data;
    }
};

int main() {
    ShallowCopy obj1(42);
    ShallowCopy obj2 = obj1; // 执行浅拷贝

    std::cout << "obj1 data: " << *obj1.data << std::endl;
    std::cout << "obj2 data: " << *obj2.data << std::endl;

    *obj1.data = 100;

    std::cout << "After modification, obj1 data: " << *obj1.data << std::endl;
    std::cout << "After modification, obj2 data: " << *obj2.data << std::endl;

    return 0;
}

在上述代码中,obj1obj2共享同一块内存,因此修改obj1data也会影响obj2data

深拷贝

深拷贝是指不仅复制对象的所有成员的值,还会复制指针所指向的内存块。这意味着每个对象都有自己的独立副本,不会互相影响。深拷贝需要在拷贝构造函数和赋值运算符中手动实现。

示例代码:

#include <iostream>

class DeepCopy {
public:
    int* data;

    DeepCopy(int value) {
        data = new int(value);
    }

    // 深拷贝构造函数
    DeepCopy(const DeepCopy& other) {
        data = new int(*other.data);
    }

    // 深拷贝赋值运算符
    DeepCopy& operator=(const DeepCopy& other) {
        if (this == &other) {
            return *this;
        }

        delete data;
        data = new int(*other.data);
        return *this;
    }

    ~DeepCopy() {
        delete data;
    }
};

int main() {
    DeepCopy obj1(42);
    DeepCopy obj2 = obj1; // 执行深拷贝

    std::cout << "obj1 data: " << *obj1.data << std::endl;
    std::cout << "obj2 data: " << *obj2.data << std::endl;

    *obj1.data = 100;

    std::cout << "After modification, obj1 data: " << *obj1.data << std::endl;
    std::cout << "After modification, obj2 data: " << *obj2.data << std::endl;

    return 0;
}

在上述代码中,obj1obj2拥有独立的内存副本,因此修改obj1data不会影响obj2data

选择使用哪种拷贝

  • 浅拷贝适用于简单的类或对象,这些对象不包含动态分配的资源。
  • 深拷贝适用于包含动态分配内存或需要独立资源副本的复杂对象。

为了避免浅拷贝带来的问题,C++11引入了移动语义,通过移动构造函数和移动赋值运算符优化资源管理。

标签:,obj1,int,ShallowCopy,DeepCopy,拷贝,data
From: https://www.cnblogs.com/keye/p/18330460

相关文章