网站建设伍金手指下拉8,怎么做通知维护网站,如何查网站建设时间,photoshop软件浅拷贝#xff1a;
定义#xff1a;浅拷贝#xff08;Shallow Copy#xff09;是一种简单的对象复制方式#xff0c;将一个对象的数据成员直接复制给另一个对象#xff08;通常是通过默认的复制构造函数或赋值运算符实现#xff09;#xff0c;这些数据成员可以是基本…浅拷贝
定义浅拷贝Shallow Copy是一种简单的对象复制方式将一个对象的数据成员直接复制给另一个对象通常是通过默认的复制构造函数或赋值运算符实现这些数据成员可以是基本类型或指向其他对象或资源的指针。具体地说浅拷贝只是复制指针的值而不是复制所指向的内存区域。
因此如果被浅拷贝的对象存在一个或多个指针成员则会导致多个对象共享同一块内存区域。当其中任何一个对象析构时该指针将被 delete 解除绑定的内存区域从而导致其他引用的该内存区域变得无效从而产生不可预期的行为如悬挂指针、内存泄漏等。
》缺点总结
1.多次析构浅拷贝n次就析构n1次 解决方法增加一个引用计数每个对象析构时--引用计数最后一个析构的对象释放空间 2.一个对象修改影响另一个对象 解决方法写时拷贝本质延迟拷贝谁去写谁做深拷贝 没人写不就赚了么 浅拷贝示例
#pragma once
#include iostream
#include assert.h
using namespace std;class mystring
{
public://全缺省构造函数mystring(const char* str )//是常量字符串常量字符串默认自带\0//受声明顺序的影响/* :_size(strlen(str)),_capacity(_size),_str(new char[_capacity1])*/{//不受声明顺序的影响_size strlen(str);_capacity _size;_str new char[_capacity 1];strcpy(_str, str);}//析构函数~mystring(){delete[] _str;_str nullptr;_size _capacity 0;}private:size_t _size;size_t _capacity;char* _str;
};//拷贝构造
int main()
{mystring s1(hello world);mystring s2(s1);return 0;
}文字说明
s2析构结束后s1析构s2刚销毁的空间。故会发生警告 深拷贝
定义深拷贝Deep Copy是一种对象复制方式将一个对象或资源以及其指向的某些对象或资源一起复制给另一个对象。具体地说深拷贝会为新对象重新分配内存空间并将被复制对象的数据成员递归地复制到新对象中。
因此如果被深拷贝的对象存在指针等非基本类型的成员变量那么深拷贝会额外申请一块与原对象所使用的内存区域大小相同的内存将其中的数据递归地复制到新对象中并返回指向该内存区域的指针。
示例
#pragma once
#include iostream
#include assert.h
using namespace std;class mystring
{
public:// 全缺省构造函数mystring(const char* str ): _size(strlen(str)), _capacity(_size), _str(new char[_capacity 1]){strcpy(_str, str);}// 拷贝构造函数mystring(const mystring str): _size(str._size), _capacity(str._capacity), _str(new char[_capacity 1]){strcpy(_str, str._str);}// 析构函数~mystring(){delete[] _str;_str nullptr;_size _capacity 0;}private:size_t _size;size_t _capacity;char* _str;
};int main()
{mystring s1(hello world);mystring s2(s1);return 0;
}
图解 文字说明
在拷贝构造函数中我们使用深拷贝方式将 _str 字符指针所指向的内存区域递归地复制到新对象中并确保在新对象销毁时释放所申请的内存空间。这样当新对象与原对象均被销毁时它们所使用的内存空间是相互独立的避免了内存泄漏和悬挂指针等问题