C++一些高级语法理解与实现原理

本文详细介绍了C++中智能指针的概念及其多种类型,包括std::auto_ptr、boost::scoped_ptr、boost::shared_ptr等,并阐述了它们各自的特点及适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.智能指针

1.1内存分区与管理:

C/C++编译的程序占用的内存:

  1、栈区(stack)—   由编译器自动分配释放 ,存放函数的参数值,局部变量的值等(如main下的int a = 0,*p2;)。其 
  操作方式类似于数据结构中的栈。栈是由高地址向低地址扩展的,高地址的2M空间被用来装载OS,分配快,使用时先放PC+4,然后是从右到左的函数参数(从右到左是因为最右边的参数被压在栈底,由于C中动态参数个数,最右边参数个数不确定,正好与栈指针无法确定栈底参数位置对应),然后是局部变量,出栈时后进先出。
  2、堆区(heap)   —   一般由程序员分配释放(如malloc(10)开辟在堆区中的内存),若程序员不释放,程序结束时可能由OS回 
  收   。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,可以用首次适应算法、循环首次适应算法、最佳/最坏适应算法分配。堆区是由低地址向高地址扩展,与栈区形成双端栈(相向生长的栈),分配慢
  3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的 
  全局变量和静态变量在一块区域(如全局的int a = 0;或在main中的static int *a=NULL),未初始化的全局变量和未初始化的 静态变量在相邻的另一块区域(如全局的int * a;)。 程序结束后由系统释放。 
  4、文字常量区   —常量字符串就是放在这里的(如char * p = "123"中的"123"在文字常量区)。   程序结束后由系统释放 
  5、程序代码区   —存放函数体的二进制代码。

内存创建与释放:

注意释放一个空指针始终是正确的。new一个const对象要同时初始化(Circle *p = new const CIrcle(0, 0

1.2七个智能指针:

首先是std::auto_ptr:用于管理单个堆内存对象。它的创建如下:std::auto_ptr<Simple> my_memory(new Simple(1)),要调用被管理对象的函数时用my_memory->fun(),my_memory.get()取出内置的指针,从而可以判断指针是否为空。

std::auto_ptr的缺点:my_memory2=my_memory的时候,my_memory2指向管理的对象,my_memory变成野指针,所以operator=有坑,所以auto_ptr当函数参数时有坑。同时由于operator=这个问题,auto_ptr也不适合放入vector中(这点我不太明白)。my_memory.release()方法返回内置的对象指针,但管理的对象并没有被释放。my_memory.reset()方法若不放入参数,则释放当前对象,若放入一个新对象,则释放原有对象,转而管理新对象。

然后是boost::scoped_ptr:也是管理单个堆内存对象,需要头文件#include <boost/smart_ptr.hpp>。下面是它与std::auto_ptr的区别:首先scoped_ptr没有release函数,也没有重载operator=符号,所以说是“独享所有权的”。所以在需要复制、传递参数时需要下面的smart_ptr:boost::shared_ptr。

boost::shared_ptr:叫做“共享所有权的”单个对象智能指针管理,在其内部使用了引用计数,有函数use_count()。注意在把它当做函数参数时,不需要用引用,如int fun(boost::shared_ptr<Simple> memory)就好了。

boost::scoped_array:这是用智能指针管理数组的,独享所有权。初始化时用内存数组:boost::scoped_array<Simple> my_memory(new Simple[2])。使用数组其中某个元素的函数时用my_memory[0].PrintSomething()。在使用数组某个元素的某个属性时用my_memory.get()[0].info_extend="Addition 00"。boost::shared_ptr同理。

boost::weak_ptr:它是专门为boost::shared_ptr准备的。比如先定义boost::weak_ptr<Simple> my_memory_weak,再定义boost::shared_ptr<Simple> my_memory(new Simple(1))。当my_memory_weak=my_memory的时候,my_memory.use_count()值为1。weak_ptr只是作为shared_ptr的观察者存在。

还有一个boost::intrusive_ptr






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值