C++错误学习之拷贝构造函数中的指针
今天来探讨一下,假设类中有内存的申请和释放.那么我们的拷贝构造函数会怎么样了.
Code
|
|
Error
|
|
输出结果: 123456Dog::Dog()0x1fc20100x1fc2010Dog::~Dog()Dog::~Dog()Error:double free or corruption (fasttop): 0x0000000001fc2010 ***
错误提示:两次释放同一块空间
Analysis
看到这个错误提示,以及输出的两个相同地址,可以肯定这个错误是由于析构函数两次释放同一块内存导致的. 解决方案很简单,只有在Dog类中显示的写出拷贝构造函数即可(其实初始列表不写也是可以的) 1234Dog (const Dog& dog):dog_tool_(new Tool()) { }
这样我们有如下的输出 12345Dog::Dog()0x11950100x1195030Dog::~Dog()Dog::~Dog()
很显然,地址不一样了,那么再析构的时候就不会出现两次删除同一块地址.
Summary
很多人把这种做法叫深拷贝,对应之前的隐式拷贝构造叫浅拷贝