深拷贝与浅拷贝的本质区别在于是否为动态资源重新分配独立内存:浅拷贝仅复制指针值导致共享堆内存,易引发野指针和double free;深拷贝则为每个对象单独分配并拷贝内容,需手动实现拷贝构造函数和赋值运算符,并注意自赋值、资源释放与异常安全;现代C++推荐使用RAII(如vector、unique_ptr)避免手写深拷贝。
深拷贝和浅拷贝的本质区别在于:是否为对象内部的动态资源(比如 new 出来的内存)重新分配独立空间。浅拷贝只复制指针值,多个对象共用同一块堆内存;深拷贝则为每个对象单独 new 一份,互不干扰。
编译器自动生成的拷贝构造函数和赋值运算符,执行的是位拷贝(bitwise copy)。如果类里有指针成员,它只复制指针地址,不复制指针指向的内容。
后果很直接:两个对象的指针指向同一块内存。一旦其中一个 delete 了,另一个再访问就是野指针;析构两次还会导致程序崩溃(double free)。
常见触发场景:
必须显式定义拷贝构造函数和赋值运算符,在函数体内对指针成员用 new 分配新内存,并把原数据逐字节拷贝过去(比如用 memcpy 或循环赋值)。
关键点:
手动写深拷贝容易出错,C++11 后推荐用智能指针(std::unique_ptr、std::shared_ptr)或容器(std::vector、std::string)管理资源。它们自带正确的拷贝/移动逻辑。
例如:
看类里有没有“裸”动态资源:
,且没交给 RAII 对象管理 → 需要深拷贝基本上就这些。深浅拷贝不是语法题,而是资源管理意识的问题。写类时先想清楚“我的对象拥有哪些资源”,再决定要不要接管拷贝逻辑。