参考:深拷贝与浅拷贝1 深拷贝与浅拷贝2
从上图可知,默认赋值构造函数和拷贝构造函数都是以位拷贝的形式进行的。如过没有自己定义赋值构造函数和拷贝构造函数,那么编译器会自动调用默认的赋值构造函数和拷贝构造函数,赋值构造函数会造成内存泄露以及重复析构问题,拷贝构造函数会造成重复析构问题
复制构造函数只能被已存在了的对象调用,拷贝构造函数是在对象被创建时调用
拷贝构造函数的调用时机:
如一个对象以值传递的方式传入函数体
一个对象以值传递的方式从函数返回
一个对象需要通过另外一个对象进行初始化。
https://blog.csdn.net/wue1206/article/details/81138097
这个例子比较容易通俗易懂
class Test
{
private:
int* p;
public:
Test(int x)
{
this->p=new int(x);
cout << "对象被创建" << endl;
}
~Test()
{
if (p != NULL)
{
delete p;
}
cout << "对象被释放" << endl;
}
int getX() { return *p; }
};
int main()
{
Test a(10);
//会调用默认的拷贝构造函数
Test b = a;
return 0;
}
注意这个判断条件
这里不管判不判断它都是一样的效果,delete都会执行2次,即使在delete p 后面加上p=NULL也会执行delete p 2次,为什么?
因为delete p 只是告诉操作系统,当前p所指向的对象不能被使用了,但是对象内存里面的内容还是不会变,因此当第二次进行析构的时候,第二个对象的p指针指向的那段内存里面的内容还是存在,只是不能被使用,因此会被delete 2次,加上p=NULL只是让p指针不再是野指针