动态内存与智能指针

动态内存与智能指针

静态内存用来保存局部static对象、类static数据成员以及定义在任何函数之外的变量(全局变量)。栈内存用来保存定义在函数内的非static对象。分配在静态或栈内存中的对象由编译器自动创建和销毁。对于栈对象,仅在其定义的程序块运行时才存在:static对象在使用之前分配,在程序结束时销毁。
除了静态内存和栈内存,每个程序还拥有一个内存池。这部分内存被称为自由空间或(heap)。用来储存动态分配的对象,即那些在程序运行时分配的对象。当动态内存不使用时,我们的代码必须显示地销毁它们。

新标准提供了两种智能指针(smart pointer)来管理动态对象。与常规指针的区别是,他们负责自动释放所指向的对象。shared_ptr允许多个指针指向同一个对象;unique_ptr则独占所指向的对象。

shared_ptr类

make_shared函数
最安全的分配和使用动态内存的方式是调用一个名为make_shared的标准库函数。此函数在动态内存中分配一个对象并初始化它,返回指向此对象的shared_ptr。
shared_ptr p3 = make_shared(42);

当然我们通常使用auto定义一个对象来保存make_shared

shared_ptr的拷贝和赋值
我们可以认为每个shared_ptr都有一个关联的计数器,通常称其为引用计数(reference count)。无论何时我们拷贝一个shared_ptr,计数器都会增加。
当用一个shared_ptr初始化另一个shared_ptr,或将它作为参数传递给一个函数,或作为函数的返回值,它所关联的计数器就会递增。
但我们给shared_ptr赋予一个新值或者shared_ptr被销毁(例如一个局部的shared_ptr离开其作用域)计数器就会递减。
shared_ptr自动销毁所管理的对象,还会自动释放相关联的内存。

//factory返回一个shared_ptr,指向一个动态分配的对象
shared_ptr<Foo> factory(T arg)
{
            //恰当地处理arg
            //shared_ptr负责释放内存
            return make_shared<Foo>(arg);
}

void ues_factory(T arg)
{
    shared_ptr<Foo> p = factory(arg);
    //使用p
}//p离开了作用域,它指向的内存会被自动释放掉

在此例中p是use_factory的局部变量,在use_factory结束时将被销毁。当p被销毁时,将递减其引用计数并检查它是否为0。在此例中,p是唯一引用factory返回的内存的对象的。由于p将被销毁,p指的这个对象也会被销毁,所占用的内存会被释放。

shared_ptr和unique_ptr公有的一些操作

p.get() 返回p中保存的指针,若智能指针释放了其对象,返回的指针所指向的对象也就消失了
p.reset() p.reset(q) p.reset(q,d) 若p是唯一指向其对象的shared_ptr,reset会释放此对象。若传递了可选的参数内置指针q,会令p指向q,否则将p置为空。若还传递了d,使用d而不是delete来释放q

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值