您的位置:首页 > 编程语言 > C语言/C++

c++primer——动态内存

2015-10-15 10:30 309 查看
在这里提到的内容里,均包含在头文件:#include<memory>里面,主要涉及c++的内存管理问题,在做项目的时候,可能会遇到,仅仅只是个人笔记,如有错误,还请大神赐教。。。。

1.智能指针:指的是在程序调用完最后一个智能指针指的对象,自动释放内存单元。包含shared_ptr,unique_ptr,weak_ptr三类(也是模板,类似于vector):

shared_ptr类:定义:shared_ptr<string >p1;//指向string,安全使用make_shared函数,这个是在内存中分配一个对象然后初始化,返回指向对象的shared_ptr,

shared_ptr<int >p3=make_shared<int> (42);//指向一个值为42的智能指针。(auto的定义方式)auto p1=make_shared<vector<string> >();当然拷贝也是可以的,auto q(p1);

共享数据:当p2和p1指向同一个对象时,p2调用结束时,并不会立即释放内存,因为p1还在使用内存。当p1和p2全部调用完成才会释放内存单元。

new和shared_ptr的结合使用

shared_ptr<int> p1=new int(1024);//这是个错误的使用方式,正确的使用方式是:(在直接初始化的时候使用)shared_ptr<int> p1(new int(1024));

其原因是内置指针不能强制转化成智能指针。

unique_ptr类:一个unique_ptr指向内容只能有一个unique_ptr指向,不能多个共享。release仅仅把当前指针置为空,看下面例子

unique_ptr<string >p2(p1.release());//将p1置为空,

unique_ptr<string >p2;p2.reset(p1.release());//将p1内存释放,p2的内存单元指向p1

weak_ptr:绑定在一个shared_ptr上,一旦对象释放,有weak_ptr也会被释放。解决了shared_ptr的问题。

2.动态数组:new和delete

这个要注意一点就是delete多个内存是要加delete[];new和delete要配套使用

3.allocator类

为了达到内存分配和对象构造的分离,使用这个类,能够申请一段单元,不需要给赋初值。

初始化:allocator<string >alloc;auto p=alloc.allocate(n);//分配n个未初始化的数据

construct初始化分配的内存,deallocate释放分配的内存单元,destroy是把申请的内存还给系统。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: