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

12.1 动态内存与智能指针

12.1.1 shared_ptr类 

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

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

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

 

12.1.2 直接管理内存

new:分配内存。

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

 

12.1.3 shared_ptr和new结合使用

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

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

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

shared_ptr<T>p(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分配的内存,记住传递给它一个删除器。

 

12.1.5 unique_ptr

unique_ptr拥有它所指的对象,某个时刻只能有一个unique_ptr指向一个给定对象,它没有类似make_shared的标准库函数返回一个unique_ptr。当定义一个unique_ptr时,需要将其绑定到一个new返回的指针上。它不支持普通的拷贝或者赋值操作。

unique_ptr<T> u1; 空,可以指向类型为T的对象,使用delete来释放它的指针。

unique_ptr<T,D> u2; 使用一个类型为D的可调用对象来释放它的指针。

unique_ptr<T,D> u(d); 用类型为D的对象d来代替delete。

u.release(); u放弃对指针的控制权,返回指针,并将u置空。

u.reset(); 释放u所指对象。

u.reset(q); 如果提供了内置指针q,令u指向这个对象,否则将u置空。

u.reset(nullptr); 

虽然不能进行拷贝或者赋值,但是可以利用release或reset将指针的所有权从一个unique_ptr转移给另一个unique。

eg. unique_ptr<string> p2(p1.release());

p2.reset(p3.release());

12.1.6 weak_ptr

weak_ptr是一种不控制所指向对象生存期的智能指针,它指向由一个shared_ptr管理的对象。讲一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数。一旦最后一个指向对象的shared_ptr被销毁,对象就会被释放。即使有weak_ptr指向对象,对象也还是会被释放。

weak_prt<T> w(sp); 与shared_prt sp 指向相同对象。T必须能转换为sp指向的类型。

w=p; p可以使一个shared_ptr或者一个weak_ptr,赋值后w和p共享对象。

w.reset(); 将w置为空。

w.use_count(); 与w共享对象的shared_ptr的数量。

w.expired(); 若w.use_count()为0,返回true,否则为false。

w.lock(); 如果expired为true,返回一个空shared_ptr,否则返回一个指向w对象的shared_ptr。

 

12.2 动态数组

虽然说,大多数应用应该使用标准库容器而不是动态分配的数组。使用容器更为简单、更不容易出现内存管理错误并且可能有更好的性能。

 

12.2.1 new和数组

猜你喜欢

转载自blog.csdn.net/ssssjiang/article/details/85047503