c++ unique_ptr两个操作之间的差异

insrf1ej  于 2023-03-25  发布在  其他
关注(0)|答案(2)|浏览(114)

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。
这两个操作的描述几乎是相似的,我觉得有点困惑,这两个操作有什么区别?你能给予我举个例子吗?

wn9m85ua

wn9m85ua1#

在这种情况下:

unique_ptr<T,D> u1

一个删除器将使用D的无参数构造器从D类型构造。在某种程度上,这将给予你一种D类型的“默认”删除器。
在这种情况下:

unique_ptr<T,D> u2(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
jm2pwxwz

jm2pwxwz2#

假设你的意思是:

std::unique_ptr<T,D> u1(new T);
std::unique_ptr<T,D> u2(new T, d); // d convertible to type D

不同之处在于,第一个要求DDefaultConstructible,因为它默认构造删除器对象,当保存的对象被销毁时使用。第二个没有相同的要求,实际的删除器对象的构造取决于d的值类别。
std::unique_ptr::unique_ptr的文档详细介绍了第二种形式的要求,这是相当复杂的。但要点是,你可以期望删除器是从你传递的参数复制或移动构造的。
它也有一个例子:
x一个一个一个一个x一个一个二个x

相关问题