一、智能指针:可以自动释放所指向的对象。
三种:shared_ptr(多个指针指向同一个对象)、unique_ptr(独占一个对象)、weak_ptr(指向shared_ptr所管理的对象)
头文件:#include<memory>
shared_ptr:
shared_ptr<int> p=make_shared<int> (43); //指向43
shared_ptr<list<int>> p; //指向list
每个shared_ptr都有关联的计数器,当计数器变为零时,它就会自动释放管理的对象。
unique_ptr:
初始化:unique_ptr<double> p1;
unique_ptr<int> p2(new int(42));
unique_ptr<string> p1(new string("stage"));
没有make_shared<>,不能拷贝和赋值。不支持拷贝()、赋值=
auto p=p1.release(); //release返回指针.将指针置空
delete p;
weak_ptr:
指向shared_ptr,指向的对象可能不存在。不会增加shared_ptr的引用计数。
auto p=make_shared<int>(43);
weak_ptr wp(p);
判断对象是否存在:
if(shared_ptr<int> p=wp.lock()){ } //lock():若非空,返回shared_ptr。
二、直接管理内存:
new、delete
int *pi=new int; //new,创建int型的对象,返回指向该对象的指针。
int *pi=new int(1024); //初始化对象
vector<int> *p=new vector<int>{1,2,3};
shared_ptr<int> p(new int(42));
shared_ptr<int> clone(int p){
return shared_ptr<int>(new int(p));
}
为多个元素分配内存:
int *p=new int[size()];
delete []p;
指针被delete后,成为空悬指针。空悬指针类似于未初始化的指针,可能造成程序崩溃。因此,在delete后,将nullptr赋予指针。(p=nullptr)
普通指针与智能指针不能混用。
三、动态数组
int *p=new int[40];
string *s=new string[10];
delete []p; //释放动态数组
unique_ptr<int[]> up(new int[10]);