即便通过上述策略2把两次delete同一对象空间的错误搞定了,但是万一程序又使用了先前的,已经没有对象空间所有权的智能指针,还会引起未定义行为,因为它指向了一个非法数据。当然这是针对auto_ptr而言的。
对于unique_ptr而言,它就好像是引用,它只能指向某一特定对象,它一旦指向某一对象别的unique_ptr就无法再指向该对象了,从而避免了两次delete和使用无效智能指针的错误。
Unique_ptr不允许两个同作用域,同生存期的指针互相赋值,但是它允许把一个临时性的unique_ptr指针赋给一个非临时性的unique_ptr指针。我想这也是为了保证只有一个unique_ptr指针能指向某一特定对象吧,因为临时性的unique_ptr使完了就没了,它不会干扰干扰外部作用域的unique_ptr指针。至于说这对于容器有好处,我还真没想到具体好处是啥。
两个同作用域同生存期的unique_ptr指针互相赋值可以使用move函数,如下图所示:
此外,unique_ptr还可以用于数组空间的分配,它会自动调用delete[]进行空间的释放,如下图所示:
在使用new进行空间分配时,你可以使用auto_ptr和shared_ptr,但是它俩不能用于new[]。
针对不使用new分配的空间,你也不能使用auto_ptr、shared_ptr和unique_ptr。
针对不使用new和new[]的情况,你不可以使用unique_ptr。