如何构造unique_ptr<T[],D>(数组专用化)?


template< class U, class E >
unique_ptr( unique_ptr<U, E>&& u ) noexcept;(6)

我发现unique_ptr<T[],D>有许多构造函数。但是我不知道如何创建一个unique_ptr<T[],D>与函数(6)你能告诉我怎么叫吗?谢谢。

参考:https://en.cppreference.com/w/cpp/memory/unique_ptr/unique_ptr

unique_ptr不能被复制,所以没有复制构造函数。构造函数5和6是move构造函数,它们将指针的所有权从原始对象中移除,并将其赋予新对象。

unique_ptr( unique_ptr&& u ) noexcept;  // (5)  (constexpr since C++23)
template< class U, class E >
unique_ptr( unique_ptr<U, E>&& u ) noexcept;    // (6)  (constexpr since C++23)

例如,up6bup6d正在使用对该函数的调用。

调用之后,智能指针up6aup6c不再指向它们之前指向的对象。

std::cout << "Example constructor(6)...n";
{
std::unique_ptr<Foo, D> up6a(new Foo, d); // D is copied
std::unique_ptr<Foo, D> up6b(std::move(up6a)); // D is moved
std::unique_ptr<Foo, D&> up6c(new Foo, d); // D is a reference
std::unique_ptr<Foo, D> up6d(std::move(up6c)); // D is copied
}

在c++ 17之前最常见的move构造函数调用是用make_unique进行初始化。您可以轻松地这样做:

std::unique_ptr<int[]> a(new int[10]);
std::unique_ptr<int[]> b(std::move(a));

但是如果你试图使用make_unique,后者需要调用特殊化来分配数组。

std::unique_ptr<int[]> b = std::make_unique<int[]>(10);

注意,没有必要调用上面提到的move构造函数。

您可以使用make_unique,如下所示:

auto ptr = std::make_unique<int[]>(2);

如果你想传递一个自定义删除器,一种方法是使用std::function,如下所示:

auto ptr = std::make_unique<int[]>(2);
//here we use lambda as a deleter  
std::unique_ptr<int[], std::function<void(int[])>> PTR(new int[2](), [](int*p)->void
{
std::cout<<"lambda called"<<std::endl;
delete[]p ;
});
std::unique_ptr<int[], std::function<void(int[])>> P2(std::move(PTR));
//or more readable
//auto P2 = std::move(PTR);

工作演示。


使用单独的函数代替lambda也是可能的,并且如下所示:

//use a free function as deleter 
void func(int p[])
{
std::cout<<"func called"<<std::endl;
delete[]p ;
}
int main()
{
auto ptr = std::make_unique<int[]>(2);

std::unique_ptr<int[], std::function<void(int[])>> PTR(new int[2](), func);
std::unique_ptr<int[], std::function<void(int[])>> up6b(std::move(PTR));
//or more readable 
//auto up6b = std::move(PTR);
}

演示

相关内容

  • 没有找到相关文章

最新更新