[C++11]_[初级]_[unique_ptr的使用场景]
来源:互联网 发布:99客服软件下载 编辑:程序博客网 时间:2024/05/22 03:20
场景
std::unique_ptr 是C++11提供的新的智能指针,特点有:
- 非线程安全的
- auto_ptr的替代品,因为它不提供copy Constructor和 Copy Assignable,也就是指针不能复制.
- 只有一个智能指针对包含的实例对象有所有权,意思是只有一个智能指针在它生命周期结束后调用析构函数.
- 它默认指针两种销毁对象的方式,一种是delete,另一种是delete[],比auto_ptr多了数组方式的delete[].
- 它没有引用计数和线程安全的方法,所以它的性能其实比shared_ptr要高,但是不适用无序的多线程环境.
最好只在单线程环境使用.
- 也适用于自定义的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
- [C++11]_[初级]_[unique_ptr的使用场景]
- [C++11]_[初级]_[shared_ptr的使用场景]
- [C++11]_[初级]_[weak_ptr的使用场景]
- [C/C++]_[初级]_[static_cast,reinterpret_cast,dynimic_cast的使用场景和区别]
- [C/C++11]_[初级]_[使用enumerations类型]
- [C/C++11]_[初级]_[使用std::tuple元组-固定大小的集合]
- [Java]_[初级]_[比较String和StringBuffer的区别和使用场景]
- [Cocoa]_[初级]_[NSThread的使用]
- [C/C++]_[初级]_[关于Gdiplus::Bitmap使用的注意事项]
- [C/C++标准库]_[初级]_[使用string stream]
- [Objective-c]_[块语法的使用及应用场景]
- [C/C++]_[初级]_[malloc-calloc-new的区别]
- [C/C++]_[初级]_[编程容易犯错的地方]
- [C/C++标准库]_[初级]_[std::map的使用细节]
- [C/C++标准库]_[初级]_[函数对象functor的使用]
- [C/C++标准库]_[初级]_[优先队列priority_queue的使用]
- [C/C++11]_[初级]_[使用正则表达式库regex]
- [C/C++11]_[初级]_[使用std::function来封装函数]
- 项目经常使用到的PCH文件设置全项目获取宏或类
- Java:单例模式的七种写法
- c、OC、C++的三种预处理功能
- Leetcode House Robber
- ArrayList、Vector、LinkedList的区别及其优缺点?
- [C++11]_[初级]_[unique_ptr的使用场景]
- centos7网卡配置bond
- 函数简介
- Scala sbt 添加国内镜像
- 作用域
- python BeautifulSoup 库 笔记
- QT的signal和slot的几种常见使用场景
- POJ 3414 Pots【BFS】【图搜】
- 关于PHP.INI中的错误ERROR报告级别设置