重复这个。
在 C++ 中,您有时必须自己实现复制构造函数(当您通常将指针作为成员时)。编译器生成的复制构造函数的缺点是,当您添加成员字段并忘记在复制构造函数中添加复制行时,您会遇到问题,这通常很难追踪。我喜欢防守性地编程,这让我有点担心。
一种解决方案是使用 memcpy,然后正确处理指针,但据我了解,这是不鼓励的。
重复这个。
在 C++ 中,您有时必须自己实现复制构造函数(当您通常将指针作为成员时)。编译器生成的复制构造函数的缺点是,当您添加成员字段并忘记在复制构造函数中添加复制行时,您会遇到问题,这通常很难追踪。我喜欢防守性地编程,这让我有点担心。
一种解决方案是使用 memcpy,然后正确处理指针,但据我了解,这是不鼓励的。
不要使用裸指针 - 如果需要,请使用智能指针为您完成复制。哟然后不再需要写一个拷贝构造函数——我在过去五年里只写了一个。
不要这样做——如果有人添加了一个指针成员变量并忘记了复制构造函数,这两种方法都行不通——我建议你在复制构造函数中为你的类的 sizeof添加一个编译时断言链接文本——如果 sizeof 会改变 - 编译断言将失败并且代码不会编译,直到有人改变条件 - 有人改变位于关于确保正确复制所有成员而不这样做的评论旁边的条件的可能性是相当的低的 ;)
不,不要使用 memcpy。您冒着覆盖您甚至不知道存在的数据的风险(例如,vtables)。此外,如果您添加的字段本身就是一个指针,那么您还没有解决任何问题。
针对这种情况进行防御性编程的最佳实践是:
每当添加字段时,请养成检查类构造函数、析构函数等的习惯
进行自动化测试
使用诸如 Purify 之类的内存调试工具(也可以使用开源工具,这可能会有所帮助。)