深拷贝和浅拷贝的核心区别在于是否为指针成员重新分配堆内存:浅拷贝仅逐值复制,导致多个对象共享同一堆内存而引发悬垂指针和重复释放;深拷贝则在拷贝构造函数中为指针成员new新内存并复制内容,确保资源独立,且凡管理动态资源的类必须遵循三/五法则自定义拷贝构造与赋值运算符。
深拷贝和浅拷贝是C++对象复制行为的核心概念,关键区别在于是否为指针成员重新分配堆内存。
值,不复制资源编译器自动生成的默认拷贝构造函数执行的是浅拷贝——对每个成员做逐个赋值。基本类型(int、double等)没问题;但若类中含指针成员(尤其指向new分配的内存),两个对象的指针会指向同一块堆区。一旦其中一个对象析构并释放该内存,另一个对象的指针就变成悬垂指针,后续访问或再次析构将引发未定义行为(如崩溃、重复释放)。
深拷贝要求在拷贝构造函数(及拷贝赋值运算符)中,为指针成员在堆上重新new一块空间,并把原对象的数据内容复制过去。这样两个对象拥有各自独立的内存,互不影响。
不是“想不想”,而是“不得不”——只要类满足以下任一条件,就必须显式定义拷贝构造函数(并大概率要配拷贝赋值运算符):
面试官往往不只问定义,更关注你能否识别问题场景并给出正确解法: