map与unordered_map

map是一种关联容器,通过键值和关联值存储元素。map使用operator <判断键值是否相同,map的存储是有序的。

unordered_map是一种无序的关联容器,根据键值的hash值判断是否相同,所以是无序存储的。

C++11 智能指针

编程程序,处理动态内存分配问题时,经常会产生内存泄漏的问题。在编程语言中,常常有两个机制解决这个问题:垃圾回收机制,智能指针。
智能指针能够更有效的管理内存,大部分操作和普通指针一样,但有一些特殊的操作。
C++11新引入了三种智能指针:shared_ptr, unique_ptr, weak_ptr。需引入#include<memory>
shared_ptr 是一个类对象,封装了指针对象,重载了两种常见的指针操作符*和->。内部采用了引用计数的机制。当指向内存对象的引用计数为0时,内存对象销毁。 它允许多个shared_ptr指针共享同一个堆内存分配的对象。user_count()的作用是获得当前对象被引用的次数,reset()的作用是释放该指针对对象的引用,将指针设为空。
shared_ptr函数不能使用常见的C++转型函数,需要使用dynamic_pointer_cast()、static_pointer_cast()、const_pointer_cast()。
weak_ptr可以解决循环引用的问题。weak_ptr可以指向shared_ptr指针指向的对象,但不拥有该内存。使用weak_ptr成员lock, 可以返回指向内存的一个shared_ptr对象, 且当所指向对象内存已经无效时,返回一个指针空值(nullptr)。weak_ptr 不能独立存在,它需要指向一个shared_ptr指针指向的内存。weak_ptr不会增加shared_ptr的指针计数。

// 环形引用
classParent
{
    public:
      shared_ptr<Parent>child;
};
classChild
{
    public:
      shared_ptr<Parent>parent;
};
shared_ptr<Parent>pA(newParent);
shared_ptr<Child>pB(newChild);
pA->child=pB;
pB->parent=pA;

 
unique_ptr 没有复制构造函数,可以防止所有权丢失。unique_ptr拥有唯一所有权,可以使用move进行所有权转移。如 unique_ptr<int> second = move(first) 或者 unique_ptr<int> second(move(first))