在这里提到的内容里,均包含在头文件:#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是把申请的内存还给系统。