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

来源:互联网 发布:99客服软件下载 编辑:程序博客网 时间:2024/05/22 03:20

场景

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

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

  3. 也适用于自定义的deleter(也可以使用lambda),即可以代理C的free,CloseHandle等等.
    auto my_free = [](void* data){ std::cout << "hello" << std::endl; free(data);};    char* buf = (char*)malloc(64);    std::unique_ptr<char,decltype(my_free)> p1(buf,my_free);

参考

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::FooFoo::~FooFoo::FooFoo::FooFoo::FooFoo::FooFoo::~FooFoo::~FooFoo::~FooFoo::~FooFoo::FooD operator()Foo::~FooTestOwner....................Foo::FooFoo::barf(const Foo&)Foo::bardestroying p2...Foo::barFoo::~FooTestArrayOwner....................Foo::FooFoo::FooFoo::FooFoo::FooFoo::barf(const Foo&)Foo::bardestroying p2...Foo::barFoo::~FooFoo::~FooFoo::~FooFoo::~Foo
0 0
原创粉丝点击