C++浅拷贝与深拷贝的问题解析
来源:互联网 发布:mac编辑hosts文件 编辑:程序博客网 时间:2024/06/06 19:46
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;
class Name
{
public:
Name(const char*myp)
{
len = strlen(myp);
p = (char*)malloc(len+1);
strcpy(p,myp);
}
~Name()
{
if (p != NULL)
free(p);
p = NULL;
len = 0;
}
private:
char* p;
int len;
};
void mainplay()
{
Name obj1("abcdef");
Name obj2 = obj1;//问题:在执行这句话时,当函数体结束时,要析构对象(且析构两次),同一个内存地址被同时free两次,所以会出错
//用obj1来初始化obj2,要执行拷贝构造函数
//由于自己没有定义拷贝构造函数,所以编译器会自动调用默认的拷贝构造函数,编译器提供的默认的拷贝构造函数是浅拷贝
//浅拷贝是指:只赋值了指针的值,而指针所指向的内存空间的内容没有被赋值,浅拷贝的结果是obj1和obj2同时指向了同一个内存空间
创建Obj1对象时,开辟内存空间存放数据,而执行到 name Obj2 = Obj1 语句时,将Obj1对象复制给Obj2对象,因为没有构造拷贝构造函数,因此调用默认的拷贝构造函数,只是进行了浅拷贝
将Obj2对象指向Obj1对象的内存空间,而Obj2对象没有自身的内存空间,当程序调用Obj2对象的析构函数时,释放了其指向的内存空间即Obj1对象开辟的内存空间。而当Obj1对象析构时,因为Obj2对象已经将其内存空间析构掉了,所以程序执行到此处将崩溃掉。
Name obj3("obj3");
obj3 = obj1;
}
编译器提供的默认的拷贝构造函数,就是把指针的值(即obj的属性值 char* p,int len)赋值给obj2,而并没有开辟一个新的内存空间,把内存空间的内容(abcdefg)赋值给obj2.所以导致同一个内存空间被同时析构两次时出错,
解决方案: 深拷贝构造函数,自己写拷贝构造函数,在开辟一个新的 内存空间,然后把空间中内容拷贝到新的内存空间
Name(const Name&obj)
{
len = strlen(obj.p);
p = (char*)malloc(len + 1);
strcpy(p,obj.p);
}
// 等号赋值操作,我们 自己没定义等号重载操作符时,编译器会自动调用默认的等号重载操作符,也是执行的浅拷贝,
Obj1和obj3指向了统一内存空间,使程序崩溃。
解决等号运算符与浅拷贝带来的问题方法就是:重载等号运算符,在函数中重新开辟一段内存空间为obj3对象所用,但是由于之前obj3已经开辟了内存空间,为了防止内存泄漏,,需要先对内存空间进行释放,然后再重新建新的内存空间。
Name& operator=(Name&obj)
{
if (p != NULL)
{
delete[] p;
p = NULL;
len = 0;
}
p = (char*)malloc(strlen(obj.p)+1);
if (p != NULL)
strcpy(p,obj.p);
len = obj.len;
return *this;
}
void main()
{
mainplay();
cout << "successful" << endl;
。
}
- C++浅拷贝与深拷贝的问题解析
- 【C++】深拷贝和浅拷贝解析
- 深拷贝与浅拷贝解析
- iOS深拷贝与浅拷贝解析
- 深拷贝与浅拷贝的解析 (学习日记)
- c++-深拷贝与浅拷贝
- 【c++】浅拷贝与深拷贝
- Objective-C 深拷贝与浅拷贝
- [C++]深拷贝与浅拷贝
- 【C++】对深拷贝与浅拷贝的再次理解
- C++——string的深拷贝与浅拷贝
- 深拷贝与浅拷贝问题
- c++中 拷贝构造函数的深拷贝和浅拷贝--“浅拷贝”与“深拷贝”
- Map拷贝 关于对象深拷贝 浅拷贝的问题
- Map拷贝 关于对象深拷贝 浅拷贝的问题
- Map拷贝 关于对象深拷贝 浅拷贝的问题
- Map拷贝 关于对象深拷贝 浅拷贝的问题
- 深拷贝与浅拷贝的实现
- kafka : Error UNKNOWN_MEMBER_ID occurred while committing offsets for group alert
- 自定义View添加到Viewgroup中layoutparams为空的记录
- Java基础学习总结(104)——多线程、并发、工具类相关的面试题
- JAVA打包xml成zip保存在服务器任意位置,并能在页面进行点击下载
- 以太网安全之企业网络的西电捷通TLSec解决方案
- C++浅拷贝与深拷贝的问题解析
- Mongodb笔记
- sql 判断某列是小数
- Python学习笔记(五)—集合(set)
- 关于性能优化的那点事——BigRender首屏渲染优化
- 一天搞定CSS:表单(form)--20
- Windows环境Git服务器搭建
- spring使用context:property-placeholder载不进属性问题
- WSGI