MST

星途 面试题库

面试题:C++中浅拷贝与深拷贝在类拷贝构造函数中的区别

请简述C++类拷贝构造函数中浅拷贝和深拷贝的概念,并举例说明在什么场景下会因为使用浅拷贝而导致程序出现错误。
26.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

浅拷贝概念

浅拷贝是指在拷贝构造函数中,新对象的成员变量直接复制源对象对应成员变量的值。对于指针类型的成员变量,只是复制了指针的值(即内存地址),而不会复制指针所指向的内存空间。这样新对象和原对象的指针成员指向同一块内存。

深拷贝概念

深拷贝是指在拷贝构造函数中,对于指针类型的成员变量,不仅会为新对象的指针成员分配新的内存空间,还会将原对象指针所指向的内容复制到新分配的内存空间中。使得新对象和原对象的指针成员指向不同但内容相同的内存区域。

浅拷贝导致程序出错场景举例

#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。当str1str2生命周期结束调用析构函数时,会对同一块内存进行两次delete操作,从而导致程序出错。若采用深拷贝,在拷贝构造函数中为str2m_data重新分配内存并复制内容,就可避免此类错误。