C++中的深拷贝和浅拷贝的简单理解

本文通过C++示例代码详细解释了浅拷贝和深拷贝的区别及其应用场景。浅拷贝仅复制对象引用,可能导致两个对象共享同一资源,从而引发问题;而深拷贝则创建完全独立的对象副本,确保资源不被共享。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

浅拷贝:拷贝的是地址(这个不太懂,别人博客的写法)
深拷贝:拷贝的是内容

对于没有指针的类,进行浅拷贝是没有问题的;
对于含有指针的类中,对于默认的拷贝构造函数也是浅拷贝;
会将两个指针指向同一个地址,再进行一次delete操作的时候,会将一个指针删除,另外一个则成为野指针;
导致程序崩溃;
简单的写法:(没加头文件)
int main()
{
	/* 浅拷贝
	int *p = new int;
	*p = 5;
	//cout<<*p;
	int *q = p;
	delete q;
	delete p;*/
	/* 深拷贝
	int *p = new int;
	*p = 5;
	//cout<<*p;
	int *q = new int;
	*q = *p;
	cout << *p << " " << *q << endl;
	delete q;
	delete p;*/
	return 0;
}
对于c++的拷贝构造函数:
// ConsoleApplication3.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<queue>
#include<algorithm>
#include<stack>
#include<cstring>
#include<vector>
#include<list>
#include<set>
#include<map>
#include<stdlib.h>
#include<time.h>
using namespace std;
#define pi (4*atan(1.0))
#define eps 1e-14
#define bug(x)  cout<<"bug"<<x<<endl;
typedef long long LL;
const int N = 1e5 + 10, M = 1e6 + 10, inf = 1e9 + 7;
const LL INF = 5e17 + 10, mod = 1e9 + 7;


class l
{
public :
	l(){}
	l(const l &a)
	{
		x = a.x;
	}
	int x;
};
class Array
{
public:
	Array(int count);
	Array(const Array &Arr);
	~Array();
	void setcount(int count);
	int getcount();
	void setm_pArr();
	void getm_pArr();
	void printAddr();
private:
	int m_count;
	int *m_pArr;
};
Array::Array(int count)
{
	m_count = count;
	m_pArr = new int[m_count];
	setm_pArr();
	cout << "Array" << endl;
}
/*Array::Array(const Array &Arr)// 浅拷贝
{
	m_pArr = Arr.m_pArr;
	this->m_count = Arr.m_count;
	cout << "Array&" << endl;
}*/
Array::Array(const Array &Arr)//深拷贝
{
	m_count = Arr.m_count;
	m_pArr = new int[m_count];
	for (int i = 0; i < m_count; i++)
		m_pArr[i] = Arr.m_pArr[i];
	cout << "Array&" << endl;
}
void Array::setcount(int count)
{
	this->m_count = count;
}
int Array::getcount()
{
	return this->m_count;
}
void Array::setm_pArr()
{
	for (int i = 0; i < m_count; i++)
		m_pArr[i] = i;
}
void Array::getm_pArr()
{
	for (int i = 0; i < m_count; i++)
		cout << m_pArr[i] << " ";
	cout << endl;
}
Array::~Array()
{
	this->printAddr();
	delete[]m_pArr;
	this->printAddr();
	m_pArr = NULL;
	cout << "~Array" << " " << this->m_count << endl;
}
void Array::printAddr()
{
	cout << "m_pArr" << " " << m_pArr << endl;
}
int main()
{
	Array arr1(5);
	Array arr2 = arr1;
	arr1.getm_pArr();
	arr2.getm_pArr();
	return 0;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值