MST

星途 面试题库

面试题:C++ 重写拷贝构造函数中的深拷贝与浅拷贝问题

有一个 `Image` 类,它包含一个指向 `unsigned char` 类型动态数组的指针,用于存储图像数据。这个动态数组的大小在运行时确定。请编写该类的拷贝构造函数,并解释为什么要采用深拷贝而不是浅拷贝,若采用浅拷贝会出现什么问题。
39.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>
#include <cstring>

class Image {
private:
    unsigned char* data;
    size_t size;
public:
    Image(size_t s) : size(s) {
        data = new unsigned char[size];
    }

    // 拷贝构造函数,采用深拷贝
    Image(const Image& other) : size(other.size) {
        data = new unsigned char[size];
        std::memcpy(data, other.data, size);
    }

    ~Image() {
        delete[] data;
    }
};

采用深拷贝的原因及浅拷贝问题

  1. 深拷贝原因:图像数据存储在动态分配的内存中,深拷贝能确保每个 Image 对象都有自己独立的图像数据副本。这样,当一个对象的图像数据发生变化时,不会影响到其他对象。如果采用浅拷贝,只是简单地复制指针,多个对象将共享同一块内存,这不符合对象独立性的要求。
  2. 浅拷贝问题
    • 内存释放问题:当多个对象共享同一块内存,析构时会导致同一块内存被多次释放,从而引发未定义行为。例如,第一个对象析构释放了内存,第二个对象析构时再释放同一块内存就会出错。
    • 数据修改问题:一个对象修改图像数据会影响其他对象,因为它们共享同一块内存。比如一个对象对图像进行滤波处理,其他对象的图像也会跟着改变,这通常不是我们期望的行为。