深入理解深拷贝与浅拷贝
1. 引言
在面向对象编程中,复制对象是一个常见的操作。然而,不同的复制方式会导致不同的结果。特别是当我们处理包含动态分配内存的对象时,理解深拷贝和浅拷贝的概念至关重要。本文将深入探讨这两种复制方式的区别及其应用场景,并通过具体示例和代码演示如何正确实现深拷贝。
2. 浅拷贝与深拷贝的基本概念
2.1 浅拷贝
浅拷贝是指仅复制对象的数据成员,而不重新分配新的内存空间。对于包含指针成员的对象,浅拷贝会导致多个对象共享同一块内存。这种行为在某些情况下可能是有害的,尤其是当对象的析构函数释放这块内存时,其他对象仍然持有指向这块内存的指针,从而引发未定义行为。
示例
假设我们有一个 Person
类,它包含一个指向字符串的指针 pName
。如果我们使用默认的复制构造函数进行浅拷贝,两个 Person
对象将共享同一块堆内存。
class Person {
public:
Person(char *pN) {
cout << "constructing " << pN << endl;
pName = new char[strlen(pN) + 1];
if