[C++11]_[初级]_[unique_ptr的使用场景]

场景

  1. std::unique_ptr 是C++11提供的新的智能指针,特点有:

    • 非线程安全的
    • auto_ptr的替代品,因为它不提供copy Constructor和 Copy Assignable,也就是指针不能复制.
    • 只有一个智能指针对包含的实例对象有所有权,意思是只有一个智能指针在它生命周期结束后调用析构函数.
    • 它默认指针两种销毁对象的方式,一种是delete,另一种是delete[],比auto_ptr多了数组方式的delete[].
    • 它没有引用计数和线程安全的方法,所以它的性能其实比shared_ptr要高,但是不适用无序的多线程环境.
  2. 可以在单线程环境使用.

  3. 也适用于自定义的deleter,即可以代理C的free,CloseHandle等等.

参考

std::unique_ptr

例子

#include <iostream>
#include <memory>
#include <stdlib.h>

struct Foo
{
 Foo()      { std::cout << "Foo::Foo\n";  }
 ~Foo()     { std::cout << "Foo::~Foo\n"; }
 void bar() { std::cout << "Foo::bar\n";  }
};

void f(const Foo &)
{
 std::cout << "f(const Foo&)\n";
}

struct D
{
 void operator()(Foo* foo)
 {
     std::cout << "D operator()" << std::endl;
     delete foo;
 }
};


void TestAutoDestroy()
{
 //1. 普通的new对象.
 std::cout << "TestDestroy...................." << std::endl;
 {
     std::unique_ptr<Foo> p1(new Foo);
 }
 //2. 普通的new[]对象.
 {
     std::unique_ptr<Foo[]> p2(new Foo[4]);
 }
 //3. 自定义的deleter.
 {
     std::unique_ptr<Foo,D> p3(new Foo);
 }
}

void TestOwner()
{
 std::cout << "TestOwner...................." << std::endl;
 //1. new object.
 std::unique_ptr<Foo> p1(new Foo);  // p1 owns Foo
 if(p1) p1->bar();

 {
     std::unique_ptr<Foo> p2(std::move(p1));  // now p2 owns Foo
     f(*p2);

     p1 = std::move(p2);  // ownership returns to p1
     p2->bar();
     std::cout << "destroying p2...\n";
 }

 p1->bar();
}

void TestArrayOwner()
{
 std::cout << "TestArrayOwner...................." << std::endl;
 //1. new[] object.
 std::unique_ptr<Foo[]> p1(new Foo[4]);  // p1 owns Foo
 if(p1) p1[0].bar();

 {
     std::unique_ptr<Foo[]> p2(std::move(p1));  // now p2 owns Foo
     f(p2[0]);

     p1 = std::move(p2);  // ownership returns to p1
     p2[0].bar();
     std::cout << "destroying p2...\n";
 }

 p1[0].bar();
}

int main()
{
 TestAutoDestroy();
 TestOwner();
 TestArrayOwner();
}

输出:

TestDestroy....................
Foo::Foo
Foo::~Foo
Foo::Foo
Foo::Foo
Foo::Foo
Foo::Foo
Foo::~Foo
Foo::~Foo
Foo::~Foo
Foo::~Foo
Foo::Foo
D operator()
Foo::~Foo
TestOwner....................
Foo::Foo
Foo::bar
f(const Foo&)
Foo::bar
destroying p2...
Foo::bar
Foo::~Foo
TestArrayOwner....................
Foo::Foo
Foo::Foo
Foo::Foo
Foo::Foo
Foo::bar
f(const Foo&)
Foo::bar
destroying p2...
Foo::bar
Foo::~Foo
Foo::~Foo
Foo::~Foo
Foo::~Foo

你可能感兴趣的:(智能指针,C++11,unique-ptr,shared-ptr,auto-ptr)