c++ primer上的两个操作说明:
unique_ptr<T,D> u1
可以指向类型为T.u1的对象的Null unique_ptrs将使用类型为D的可调用对象来释放其指针。
unique_ptr<T,D> u2(d)
u2指向使用d的类型为T的对象,而d必须是D类型的对象,以代替delete。这两个操作的描述几乎是相似的,我觉得有点困惑,这两个操作有什么区别?你能给予我举个例子吗?
wn9m85ua1#
在这种情况下:
一个删除器将使用D的无参数构造器从D类型构造。在某种程度上,这将给予你一种D类型的“默认”删除器。在这种情况下:
D
指定了D类型的删除器d,你可以选择删除器示例。也许D类型有一些内部化到它的示例中的变体,或者D类型没有无参数构造函数。第一种情况:选择删除器的类型。第二例:选择删除器的示例。
d
#include <iostream> #include <memory> #include <string> struct Foo { // object to manage Foo() { std::cout << "Foo ctor\n"; } ~Foo() { std::cout << "~Foo dtor\n"; } }; struct D { // deleter std::string msg; D() { msg = "removing"; }; D(std::string m) { msg = m; } void operator()(Foo* p) const { std::cout << msg << std::endl; delete p; }; }; int main() { std::unique_ptr<Foo,D> u1(new Foo); D d("deleting"); std::unique_ptr<Foo,D> u2(new Foo,d); }
将给予:
Foo ctor Foo ctor deleting ~Foo dtor removing ~Foo dtor
jm2pwxwz2#
假设你的意思是:
std::unique_ptr<T,D> u1(new T); std::unique_ptr<T,D> u2(new T, d); // d convertible to type D
不同之处在于,第一个要求D是 DefaultConstructible,因为它默认构造删除器对象,当保存的对象被销毁时使用。第二个没有相同的要求,实际的删除器对象的构造取决于d的值类别。std::unique_ptr::unique_ptr的文档详细介绍了第二种形式的要求,这是相当复杂的。但要点是,你可以期望删除器是从你传递的参数复制或移动构造的。它也有一个例子:x一个一个一个一个x一个一个二个x
std::unique_ptr::unique_ptr
2条答案
按热度按时间wn9m85ua1#
在这种情况下:
一个删除器将使用
D
的无参数构造器从D
类型构造。在某种程度上,这将给予你一种D
类型的“默认”删除器。在这种情况下:
指定了
D
类型的删除器d
,你可以选择删除器示例。也许D
类型有一些内部化到它的示例中的变体,或者D
类型没有无参数构造函数。第一种情况:选择删除器的类型。
第二例:选择删除器的示例。
将给予:
jm2pwxwz2#
假设你的意思是:
不同之处在于,第一个要求
D
是 DefaultConstructible,因为它默认构造删除器对象,当保存的对象被销毁时使用。第二个没有相同的要求,实际的删除器对象的构造取决于d
的值类别。std::unique_ptr::unique_ptr
的文档详细介绍了第二种形式的要求,这是相当复杂的。但要点是,你可以期望删除器是从你传递的参数复制或移动构造的。它也有一个例子:
x一个一个一个一个x一个一个二个x