C# · 12月 20, 2021

[C++]12章 动态内存和智能指针

 shared_ptr p; 智能指针,可以指向类型为T的对象。

p.get(); 返回p中保存的指针,返回的是一个内置指针,指向智能指针所管理的对象。适用于:我们需要向不能使用智能指针的代码传递一个内置指针。使用get返回的指针的代码不能delete此指针。不要使用get初始化另一个智能指针或者为另一个智能指针赋值。

p.use_count();返回与p共享对象的智能指针数量。

new:分配内存。

int* pi=new int; //pi指向一个动态分配的、未初始化的无名对象;

shared_ptr p(q); p管理内置指针q所指向的对象;q必须指向new分配的内存,且能够转换为T*类型。

shared_ptrp(u); p从unique_ptr u那里接管了对象的所有权,将u置为空。

shared_ptrp(q,d);  p管理内置指针q所指向的对象;q必须指向new分配的内存,且能够转换为T*类型。p将使用可调用对象d来代替delete.

shared_ptrp(p2,d);  p是shared_ptr p2的拷贝,p将使用可调用对象d来代替delete。

p.reset();

p.reset(q);

p.reset(q,d);

若p是唯一指向其对象的shared_ptr,reset会释放此对象。若传递了可选的参数内置指针q,会令p指向q,否则会将p置空。若还传递了参数d,将会调用d而不是delete来释放q。

重要:1.不要混用普通指针和智能纸指针。

2.不要使用get初始化另一个智能指针,或者为另一个智能指针赋值。

3.不使用相同的内置指针初始化或者reset多个智能指针。

4.不delete get()返回的指针。

5.不使用get()初始化或reset另一个智能指针。

6.如果你使用get()返回的指针,记住当最后一个对应的智能指针销毁后,你的指针就变为无效了。

7.如果你使用智能指针管理的资源不是new分配的内存,记住传递给它一个删除器。