自定义复制构造函数并添加字段

时间:2009-03-27 20:23:57

标签: c++ defensive-programming

this重复。

在C ++中,您有时必须自己实现复制构造函数(当您通常将指针作为成员时)。在编译器生成的复制构造函数中,这样做的缺点是,当您添加成员字段并忘记在复制构造函数中添加复制行时,您会遇到问题,这通常很难追踪。我喜欢防守计划,这让我有点担心。

一种解决方案是使用memcpy然后只是正确处理指针,但我不鼓励这样做。

3 个答案:

答案 0 :(得分:2)

不要使用裸指针 - 如果需要,请使用智能指针为您执行复制。然后,你不再需要写一个复制构造函数 - 我在过去的五年里只编写了一个。

答案 1 :(得分:1)

不要这样做 - 如果有人添加指针成员变量并忘记复制构造函数,它将无法正常工作 - 我建议你在复制构造函数中添加编译时断言link text你的类的sizeof - 如果sizeof会改变 - 编译断言将失败,代码将无法编译,直到有人改变条件 - 有人改变条件的可能性,该条件位于关于确保正确复制所有成员的注释旁边并没有做到这一点很低;)

答案 2 :(得分:0)

不,不要使用memcpy。你冒着覆盖你甚至不知道存在的数据的风​​险(例如,vtable。)另外,如果你添加的字段本身就是一个指针,那么你还没有解决任何问题。

针对这种情况进行防御性编程的最佳做法是:

  • 习惯在每次添加字段时检查类构造函数,析构函数等

  • 进行自动化测试

  • 使用Purify等内存调试工具(也可以使用开源工具。)