浅拷贝:当类对象之间赋值的时候,如果代码之间没有手工编写拷贝构造函数的时候,会自动调用默认的拷贝构造函数。这时候内存中会发生简单的复制。当调用虚构函数对内存进行销毁的时候,会发现堆中的内存需要销毁两次。故会出现问题
解决方案:手工编写拷贝构造函数 。使用深拷贝
还存在一种类似的情况,就是当我们调用等号运算符的时候,也会发现类似的情况。同样的我们需要手工重载等号运算符。
#include "iostream"
#include "string.h"
using namespace std;
class Name{
public:
Name(const char* name){
m_len = strlen(name);
m_name = new char[m_len + 1];
strcpy(m_name, name);
}
Name(const Name* obj){
m_len = strlen(obj.m_name);
m_name = new char[m_len + 1];
strcpy(m_name, obj.m_name);
}
~Name(){
if(m_name != NULL){
delete [] m_name;
m_name = NULL;
m_len = 0;
}
}
private:
char *m_name;
int m_len;
};
//
void testCopy(){
Name name1("abc");
Name name2 = name1;
}
int main(){
testCopy();
while(1);
return 0;
}