深拷贝 浅拷贝 引用计数

;深拷贝 浅拷贝

深拷贝(成员用到了指针存储空间地址)每个对象的成员都有自己独立的成员内存地址空间,造成了浪费

浅拷贝,把原对象的指针也直接拷贝过来我还是用的这一片空间,但是析构会有重复释放问题,解决重复释放用引用计数记录这个类产生了多少对象,析构的时候--引用计数就可以了

计数为0   delete 这块内存空间

;引用计数技术

优点:所有对象共享同一片空间,间接的达到了对象间的数据共享

缺点:一旦一个对象改变了这片内存,那么所有的对象都受到影响

;写时拷贝技术

当对象需要操作这一块空间存放数据时看看它是否对这块空间产生了写操作在决定是深拷贝还是浅拷贝

;拷贝构造发生时机

实例化一个对象并且右值是一个对象,这是后发生拷贝构造

class obj2=obj1 发生拷贝构造

obj2=obj3; 不发生拷贝构造原因obj2不是新实例化的对象, 可以重写=号处理指针

时间: 2024-11-18 14:11:32

深拷贝 浅拷贝 引用计数的相关文章

深拷贝&浅拷贝&引用计数&写时拷贝

(1).浅拷贝: class String { public: String(const char* str="") :_str(new char[strlen(str)+1]) { strcpy(_str,str); } ~String() { if(NULL!=_str) { delete[] _str; _str=NULL; } } private: char* _str; }; int main() { String s1("hello"); String

深拷贝以及引用计数

#define _CRT_SECURE_NO_WARNINGS    #include <iostream> using namespace std; #include <Windows.h> //深拷贝 class String { public: String(const char* pData) : _pData(new char[strlen(pData) + 1]) { strcpy(_pData, pData); }   String(const String&

opencv笔记(一)——Mat的引用计数机制

Mat是Opencv2里面主要的类.Mat的对象常常用来表示一副图像的信息. Mat的基本操作十分简单,不多说了.下面这段代码能够读七八分明白,应该就算对Mat有大体了解. 1 /* For description look into the help() function. */ 2 3 #include "opencv2/core/core.hpp" 4 #include <iostream> 5 6 using namespace std; 7 using names

动态内存管理(引用计数)

c++的动态内存管理是非常重要的,操作不当很容易引起内存泄漏, 下面我详细写了一些内存管理该注意的地方,包括引用计数的实现 深拷贝浅拷贝 #include <iostream>using namespace std; class String{public: String()  :_str(new char[1]) {  *_str = '\0'; } String(char* str)  :_str(new char[strlen(str)+1])  //开辟一段新空间给_str {  st

Python 对象的引用计数和拷贝

Python 对象的引用计数和拷贝 Python是一种面向对象的语言,包括变量.函数.类.模块等等一切皆对象. 在python中,每个对象有以下三个属性: 1.id,每个对象都有一个唯一的身份标识自己,可通过内建函数id(obj)查看. 2.type,对象的类型决定了该对象可以保存什么类型的值,可用内建函数type(obj)查看: 3.value,即对象的值. 下面是一个例子: >>> str = "hello world" >>> type(str

Objective-C 引用计数:不讲用法,只说原理

本文所使用的源码为 objc4-647 和 CF-1153.18 实际上这是我本周实习周报的一部分,写的比较仓促,如有差错还请多多指正. 不讲用法,只说原理. 引用计数如何存储 有些对象如果支持使用 TaggedPointer,苹果会直接将其指针值作为引用计数返回:如果当前设备是 64 位环境并且使用 Objective-C 2.0,那么“一些”对象会使用其 isa 指针的一部分空间来存储它的引用计数:否则 Runtime 会使用一张散列表来管理引用计数. 其实还有一种情况会改变引用计数的存储策

针对NSString的copy修饰前后,引用计数的变化

1 NSLog(@"NSString的对象,用NSString来接---------------------------------"); 2 NSString *string1 = [[NSString alloc]initWithFormat:@"不可变字符串"]; 3 NSLog(@"copy前,不可变字符串的引用计数 = %ld", [string1 retainCount]); 4 5 NSString *copyString1 = s

玩转深拷贝/浅拷贝

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px "Helvetica Neue"; color: #000000 } span.s1 { } ======================================== p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px "Helvetica Neue"; color: #000000 } span.s

探讨一下iOS中深拷贝&amp;浅拷贝&amp;copy的那些事儿

什么是深拷贝?什么是浅拷贝? 为什么经常看到字符串属性要这样定义,那个copy是神马意思? @property(nonatomic,copy)NSString* name; 为什么下面的写法是错误的? @property(nonatomic,copy)NSMutableString* name; copyWithZone方法又到底是干嘛用的? 接下来,我们将一起,一步一步的去揭晓问题的答案. Copy到底是个啥? 其实我们真的没必要把copy想的太高深.它之所以叫copy,其终极目的已不言而喻,