浅拷贝与深拷贝

  浅拷贝就是让一个已经有的指针重新指向另一块已有的内存,而深拷贝则是重新分配一块内存,让一个指针指向它,然后把另一块内存中的数据拷贝到这个指针指向的内存中去。


例如:char *p;char *p1="jksgj";

            p=p1;//此为浅拷贝

//深拷贝

            int len=strlen[p1];

            p=new char[len+1];

            strcpy(p,p1);

             

使用浅拷贝在进行资源释放的时候,容易出现资源的重复释放而导致程序出错,所以一避免使用浅拷贝而使用深拷贝,例如在实现一个string类的构造函数中:

//MyString.h

#pragma once
class MyString
{
public:
MyString();
explicit MyString(char *data);
MyString(const MyString&other);
MyString(int n, char c);
MyString&operator=(const MyString&rgs);
~MyString();
private:
char*m_data;
};

//MyString.cpp

#include "stdafx.h"
#include "MyString.h"
#include <string.h>


MyString::MyString()
:m_data(NULL)
{
}
MyString::MyString( char*data)
// : m_data(data)不能浅拷贝,只能深拷贝
{
if (data == NULL)
{
m_data = new char[1];
m_data = '\0';
}
else
{
int len = strlen(data);
m_data = new char[len + 1];
// memset(m_data, 0, sizeof(m_data));可加可不加
strcpy(m_data, data);
}
}
MyString::MyString(int n, char c)
{
m_data = new char[n + 1];
for (int i = 0; i < n; i++)
m_data[i] = c;
}
//所有的成员变量都要进行一一的初始化
MyString::MyString(const MyString&other)
//:m_data(other.m_data)不能浅拷贝
{
int len = strlen(other.m_data);
m_data = new char[len + 1];
strcpy(m_data, other.m_data);
}
MyString&MyString::operator=(const MyString&rgs)
{
//1.判断是否相等,防止自我赋值
if (this == &rgs)
return *this;
//2.申请资源之前,一定要清理之前的资源
if (m_data != NULL)
{
        delete[]m_data;
m_data = NULL;
}

//3.对所有成员的变量要一一赋值
int len = strlen(rgs.m_data);
m_data = new char[len + 1];
strcpy(m_data, rgs.m_data);


//4.返回一个对象的引用
return *this;
}
MyString::~MyString()
{
if (m_data != NULL)
{
delete[]m_data;
m_data = NULL;
}
}

 


如果再上面的代码处使用浅拷贝的话,如果在MyString::MyString( char*data)
// : m_data(data)不能浅拷贝,只能深拷贝
此处的data是指向动态分配的内存的话,此时经过参数化列表传参,则m_data和data必定指向同一块动态分配的内存,那么在析构函数中释放资源时delete []p,delete[]p1,

就会出现资源的重复释放,从而导致程序出错。

技术选型 【后端】:Java 【框架】:springboot 【前端】:vue 【JDK版本】:JDK1.8 【服务器】:tomcat7+ 【数据库】:mysql 5.7+ 项目包含前后台完整源码。 项目都经过严格调试,确保可以运行! 具体项目介绍可查看博主文章或私聊获取 助力学习实践,提升编程技能,快来获取这份宝贵的资源吧! 在当今快速发展的信息技术领域,技术选型是决定一个项目成功与否的重要因素之一。基于以下的技术栈,我们为您带来了一份完善且经过实践验证的项目资源,让您在学习和提升编程技能的道路上事半功倍。以下是该项目的技术选型和其组件的详细介绍。 在后端技术方面,我们选择了Java作为编程语言。Java以其稳健性、跨平台性和丰富的库支持,在企业级应用中处于领导地位。项目采用了流行的Spring Boot框架,这个框架以简化Java企业级开发而闻名。Spring Boot提供了简洁的配置方式、内置的嵌入式服务器支持以及强大的生态系统,使开发者能够更高效地构建和部署应用。 前端技术方面,我们使用了Vue.js,这是一个用于构建用户界面的渐进式JavaScript框架。Vue以其易上手、灵活和性能出色而受到开发者的青睐,它的组件化开发思想也有助于提高代码的复用性和可维护性。 项目的编译和运行环境选择了JDK 1.8。尽管Java已经推出了更新的版本,但JDK 1.8依旧是一种成熟且稳定的选择,广泛应用于各类项目中,确保了兼容性和稳定性。 在服务器方面,本项目部署在Tomcat 7+之上。Tomcat是Apache软件基金会下的一个开源Servlet容器,也是应用最为广泛的Java Web服务器之一。其稳定性和可靠的性能表现为Java Web应用提供了坚实的支持。 数据库方面,我们采用了MySQL 5.7+。MySQL是一种高效、可靠且使用广泛的关系型数据库管理系统,5.7版本在性能和功能上都有显著的提升。 值得一提的是,该项目包含了前后台的完整源码,并经过严格调试,确保可以顺利运行。通过项目的学习和实践,您将能更好地掌握从后端到前端的完整开发流程,提升自己的编程技能。欢迎参考博主的详细文章或私信获取更多信息,利用这一宝贵资源来推进您的技术成长之路!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值