浅谈C++智能指针

操作内存

创建内存:new

过程:用new创建内存,如果成功的话那么直接分配,然后调用对象的构造函数,如果分配不够,那么先去调用用户自己写的set_new_handler函数,一般这个函数是用来释放些内存,然后使多点内存,然后再去申请,如果还是不行,再调用该函数,但是一般就是用个标记变量释放第一次,第二次直接退出,然后会返回一个bad_alloc错误

释放内存:delete

过程:调用析构函数,然后释放内存,如果释放一个数组,那么就是找到数组前几个字节,一般有个保存长度的东西

智能指针

原因:因为动态内存在用指针使用上,如果忘记释放,那么很容易造成内存泄漏,所以推出了智能指针,智能指针也就是一个利用了rall资源管理机制,就是利用把当前变量转换成对象,利用析构函数来释放内存

shared_ptr<>:首先我们要清楚的是这是一个对象,也就是包括了构造 析构 赋值 等的一个东西,这个话是一个能允许多个指针来操作的一个指针

核心概念:类里面包含一个计数器,一个指针,通过拷贝构造,赋值 来使当前计数器加一,如果释放计数器减一,计数器为0才使用delete,改变指向的时候,就要先把老对象计数器减一,然后再去改变指向再计数器加一

初始化:开始利用构造函数进行初始化,如果在外面的话就需要使用make_shared<T>(x)来把当前给转化成智能指针对象

unique_ptr<int> :也就是只能一个指针指向对象,所以就需要把拷贝构造和赋值操作都给禁用掉

主要问题:

u.release 不能直接普通的调用,这个只是放弃控制权而已,但是这个又是只有一个指针指向,如果不把返回值给其他对象那么就会找出内存泄漏

正确操作 u1.reset(u2.release)

原文地址:https://www.cnblogs.com/Lis-/p/12639364.html

时间: 2024-09-28 16:40:12

浅谈C++智能指针的相关文章

浅谈RAII&智能指针

关于RAII,官方给出的解释是这样的"资源获取就是初始化".听起来貌似不是很懂的哈,其实说的通俗点的话就是它是一种管理资源,避免内存泄漏的一种方法.它可以保证在各种情况下,当你对对象进行使用时先通过构造函数来进行资源的分配和初始化,最后通过析构函数来进行清理,有效的保证了资源的正确分配和释放.(特别是在异常中,因为异常往往会改变代码正确的执行顺序,这就很容易引起资源管理的混乱和内存的泄漏) 其中智能指针就是RAII的一种实现模式,所谓的智能就是它可以自动化的来管理它所指向那份空间的资源

浅谈ObjectARX智能指针AcDbObjectPointer的用法

前言 用ARX智能指针打开对象,可以不在乎是否close,但同时也要注意这个变量的作用域(生命周期)问题,ARX智能指针,他的原理是利用类的析构造函数特性自动关闭对象. 这里的智能指针指的是AcDbObjectPointer这一类使用AcDbObjectPointerBase基类派生的类模板统称. 下面是打开示例. void testOpen() { ads_point pt; ads_name ent; if (RTNORM != acedEntSel(NULL,ent,pt)) { retu

浅谈为什么只有指针能够完成多态及动态转型的一个误区

c++多态由一个函数地址数组Vtable和一个指向Vtable的指针vptr实现. 具体来说,类拥有自己的vtable,类的vtable在编译时刻完成. 每个对象有自己的vptr指针,该指针初始化时指向对象所实现的类的vtable. 关于向上转型的误区: 通常对于向上转型的理解是这样的,当子类对象向上转型(允许隐式)成父类对象时,实际上只是将子类对象暂时看做父类对象,内部的数据并未改变. 对于没有虚函数的对象,这句话是正确的,但是,当引入虚函数后,这样的理解是有问题的,实际上,向上转型的过程中,

转 浅谈C++中指针和引用的区别

浅谈C++中指针和引用的区别 浅谈C++中指针和引用的区别 指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元:而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已.如: int a=1;int *p=&a; int a=1;int &b=a; 上面定义了一个整形变量和一个指针变量p,该指针变量指向a

C++ 浅谈C++中指针和引用

浅谈C++中指针和引用的区别 指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元:而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已.如: int a=1;int *p=&a; int a=1;int &b=a; 上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单

libsvm代码阅读(2):svm.cpp浅谈和函数指针(转)

svm.cpp浅谈 svm.cpp总共有3159行代码,实现了svm算法的核心功能,里面总共有Cache.Kernel.ONE_CLASS_Q.QMatrix.Solver.Solver_NU.SVC_Q.SVR_Q 8个类(如下图1所示),而它们之间的继承和组合关系如图2.图3所示.在这些类中Cache.Kernel.Solver是核心类,对整个算法起支撑作用.在以后的博文中我们将对这3个核心类做重点注解分析,另外还将对svm.cpp中的svm_train函数做一个注解分析. 图1 图2 图3

谈c++智能指针

在软件框架设计过程中,若引入智能指针来实现内存的自动管理,那意味着不得不放弃c++面向对象以虚函数为基础实现多态来提供统一接口的特性,从而采用模板来提供接口. 为什么c++不引入内存自动管理机制? c++这门程式设计语言的初衷就是不为程序员强加更多的枷锁,当然,这样会使该程式语言的易用性.可掌握性不如java, python(程序员不需再关注内存管理). 但java, python在某些应用场合却不得不让位于c++,例如实时控制系统.操作系统编程.

浅谈C++中指针和引用的区别

指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元:而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已.如: int a=1;int *p=&a; int a=1;int &b=a; 上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址. 而下面2句定义了一

浅谈数组与指针

对于一维数组与指针: 对于二维数组与指针: