面试题答案
一键面试浅拷贝概念
浅拷贝是指在拷贝构造函数中,新对象的成员变量直接复制源对象对应成员变量的值。对于指针类型的成员变量,只是复制了指针的值(即内存地址),而不会复制指针所指向的内存空间。这样新对象和原对象的指针成员指向同一块内存。
深拷贝概念
深拷贝是指在拷贝构造函数中,对于指针类型的成员变量,不仅会为新对象的指针成员分配新的内存空间,还会将原对象指针所指向的内容复制到新分配的内存空间中。使得新对象和原对象的指针成员指向不同但内容相同的内存区域。
浅拷贝导致程序出错场景举例
#include <iostream>
#include <cstring>
class MyString {
public:
MyString(const char* str = nullptr) {
if (str == nullptr) {
m_data = new char[1];
m_data[0] = '\0';
}
else {
m_data = new char[strlen(str) + 1];
strcpy(m_data, str);
}
}
// 浅拷贝构造函数
MyString(const MyString& other) {
m_data = other.m_data;
}
~MyString() {
delete[] m_data;
}
private:
char* m_data;
};
int main() {
MyString str1("Hello");
MyString str2(str1);
// 此时str1和str2的m_data指向同一块内存
return 0;
}
// 当程序执行到这里,str1和str2先后调用析构函数,会对同一块内存delete两次,导致程序崩溃
在上述代码中,MyString
类的浅拷贝构造函数只是简单复制了指针m_data
。当str1
和str2
生命周期结束调用析构函数时,会对同一块内存进行两次delete
操作,从而导致程序出错。若采用深拷贝,在拷贝构造函数中为str2
的m_data
重新分配内存并复制内容,就可避免此类错误。