应避免多个智能指针指向同一个堆内存时引发的多次删除同一个堆内存空间的情况。
auto_ptr // 使用赋值操作时将转让所有权(对堆内存的所有权) unique_ptr // 与auto_ptr同,但更严格 shared_ptr // 跟踪引用特定对象的智能指针数,仅当最后一个指针过期时,才调用delete
### unique_ptr与auto_ptr的差别在与前者在编译阶段差错而auto_ptr在运行阶段才能检测到错误(前者更安全)
### 还需注意的是,程序试图将一个unique_ptr赋值给另一个时(shared_ptr和auto_ptr也行),如果源unique_ptr是一个临时右值(用作函数返回值),
### 编译器允许这样做,如果源 unique_ptr 将存在一段时间,编译器将禁止这样做
### 第三点是auto_ptr、shared_ptr只能使用new版本,而unique_ptr还支持new[ ]版本(使用delete[ ])