C++ 复制构造函数,带指针
C++ copy constructor, with pointers
我们在定义拷贝构造函数的时候,是否需要清除我们覆盖的对象的内容?我正在实现一个二叉搜索树,想知道我是否不会有内存泄漏,除非我在实现复制构造函数和赋值运算符时清理它。
如果复制构造函数是运行,则没有"object we are writing over"。您正在从头开始创建 ("constructing") 一个新对象,但从其他对象复制数据以填充其初始状态。
对于赋值运算符,是的,这绝对是一个考虑因素,您需要确保避免泄漏。但是,如果您使用 RAII,那么您就没有任何手动内存管理,那么您就没有什么可担心的。 (除此之外,我不明白指针是怎么进来的。)
When we define the copy constructor, is it required that we clear the contents of the object we are writing over?
构建时没有需要覆盖的内容。只要确保你在构造函数成员初始化器列表中执行所有成员变量的副本,而不是在构造函数的主体中执行。
否则编译器会为成员生成默认初始化,然后可能会分配一些东西,实际上需要清除和覆盖(或深度复制)。
特别是如果你像你声称的那样用指针处理。
最好您应该遵循 The Rule of Three (Five) 以确保一切都一致地完成。
正如其他人所说,使用复制构造函数将创建一个新对象。
您必须考虑的事项:
如果您的原始对象是其他一些数据的所有者,例如foo*
分配 new
或 shared_ptr
,复制对象只会复制指针及其地址。
您实际上不会复制拥有的数据。
如果析构函数中有原始 foo*
和 delete foo
,则第二个被销毁的对象将尝试删除已删除的内存。
我们在定义拷贝构造函数的时候,是否需要清除我们覆盖的对象的内容?我正在实现一个二叉搜索树,想知道我是否不会有内存泄漏,除非我在实现复制构造函数和赋值运算符时清理它。
如果复制构造函数是运行,则没有"object we are writing over"。您正在从头开始创建 ("constructing") 一个新对象,但从其他对象复制数据以填充其初始状态。
对于赋值运算符,是的,这绝对是一个考虑因素,您需要确保避免泄漏。但是,如果您使用 RAII,那么您就没有任何手动内存管理,那么您就没有什么可担心的。 (除此之外,我不明白指针是怎么进来的。)
When we define the copy constructor, is it required that we clear the contents of the object we are writing over?
构建时没有需要覆盖的内容。只要确保你在构造函数成员初始化器列表中执行所有成员变量的副本,而不是在构造函数的主体中执行。
否则编译器会为成员生成默认初始化,然后可能会分配一些东西,实际上需要清除和覆盖(或深度复制)。
特别是如果你像你声称的那样用指针处理。
最好您应该遵循 The Rule of Three (Five) 以确保一切都一致地完成。
正如其他人所说,使用复制构造函数将创建一个新对象。
您必须考虑的事项:
如果您的原始对象是其他一些数据的所有者,例如foo*
分配 new
或 shared_ptr
,复制对象只会复制指针及其地址。
您实际上不会复制拥有的数据。
如果析构函数中有原始 foo*
和 delete foo
,则第二个被销毁的对象将尝试删除已删除的内存。