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