std::unique_ptr 是一种独占的语义,即只允许一个智能指针引用裸指针,这区别于 std::shared_ptr 允许多个 shared_ptr 引用同一个裸指针,它没有引用计数,它的性能比 shared_ptr 会高一点。 在用法上 std::unique_ptr 和 ...
{ std::unique_ptr<A, std::function<void(A*)>>p(newA, [](A* ptr){ std::cout <<"delete from a custom deleter...\n";deleteptr; }); } } 编译和运行代码:在 build 目录下执行 g++ ../code5.cpp -o code5 -std=c++11 && ./code5 输出结果: 1destruct A destruct A destruct A de...
}std::unique_ptr<int> up =std::make_unique<int>();// 错误的,无法通过编译// std::function<void()> func = std::bind(&Test, std::move(up));// 正确的,可以通过编译autofunc =std::bind(&Test,std::move(up)); 其实这是绑定生成了一个不可拷贝(只可移动)的闭包类型,而std::function是...
std::function<void(int*)> delFunc = delLambda;intmain(){std::unique_ptr<int>p1(nullptr);std::unique_ptr<int,decltype(Delete)*>p2(nullptr, Delete);std::unique_ptr<int,decltype(delLambda)>p3(nullptr, delLambda);std::unique_ptr<int,decltype(delFunc)>p4(nullptr, delFunc); std::cout ...
//仿函数方式classDeleter{public:voidoperator()(Sample*x){std::cout<<"Deleter function called"<<std::endl;delete[]x;}};// 构造函数传递自定义删除器指针std::shared_ptr<Sample>p2(newSample[5],Deleter); //使用std::functionvoidDeleter(Connection*connection){close(connection);deleteconnection;}int...
如果使用function object,std::unique_ptr其实是将该function object的类型作为基类。因为是无状态的,因此,可以运用EBO(Empty Base Optimization),也就不占用任何空间。事实上,这个基类没有任何成员(无状态),只有成员函数deleter,因此,在调用deleter时不需要函数指针,编译器直接根据类型就可以找到该函数。
对于类成员函数、lambda表达式或其他可调用对象就无能为力了,因此,C++11推出了std::function与std::...
0\bits\predefined_ops.h:123:18: error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = Deduction; _Dp = std::default_delete<Deduction>]' { return bool(_M_comp(*__it1, *__it2)); } 当我将自定义比较器传递...
lambda deleter时内存消耗更少,因为可以利用EBO。自定义deleter则需要存储函数指针。function object,如functor,因其无状态可作为基类,而lambda和functor有别。虽然与std::unique_ptr关系不大,但理解基类与虚析构函数在多态中的作用至关重要,确保析构时正确操作子类对象。更多细节,读者可进一步探索。
和std::auto_ptr一样,std::unique_ptr也是一种智能指针,它也是通过指针的方式来管理对象资源,并且在 unique_ptr 的生命期结束后释放该资源。 unique_ptr 持有对对象的独有权 —— 两个 unique_ptr 不能指向一个对象,...