gpt4 book ai didi

c++ - 多态 unique_ptr 数组

转载 作者:行者123 更新时间:2023-11-30 02:45:04 25 4
gpt4 key购买 nike

使用唯一指针,我们可以写

class A{};
class B: public A{};
class C: public A{};
std::vector<std::unique_ptr<A>> myArray;
//
f()
{
std::unique_ptr<B> pB {new B()};
std::unique_ptr<C> pC {new C()};
myArray.push_back(std::move(pB));
myArray.push_back(std::move(pC));
// nice! now I can use the interface of A without
// worrying about its subclasses.
}

但是,如果类 BC 需要有它们自己的依赖于类型的自定义删除器:

class A{};
class B: public A{};
class C: public A{};

template<class T>
struct custom_deleter
{ // roughly the same implementation as std::default_deleter
void operator()(T* p)
{
CustomFree(p);
}
};
//
std::vector<std::unique_ptr<A>> myArray;
//
f()
{
std::unique_ptr<B, custom_deleter<B>> pB {CustomAlloc(B())};
std::unique_ptr<C, custom_deleter<C>> pC {CustomAlloc(C())};
myArray.push_back(std::move(pB)); // error: can't convert to default deleter
myArray.push_back(std::move(pC)); // item dito
}

有没有办法实现我在这里尝试做的事情?

最佳答案

您的第一个示例具有未定义的行为,因为 A没有 virtual析构函数。 unique_ptr的默认删除器, std::default_delete 是无状态的,所以 unique_ptr<A>总是会调用delete p; ,其中 p 的静态类型是A* .

你的代码编译是因为 default_delete<T>复制构造函数可以接受另一个 default_delete<U>实例只要U*可隐式转换为 T* ,在这种情况下。但是,当基类析构函数不是virtual时,通过基类指针多态删除派生类对象。是未定义的行为。


每个类型的自定义删除器的第二个问题可以通过提供一个自定义删除器来解决,该删除器是一个 lambda,它首先将参数转换为适当的类型,然后再将其传递给该对象的删除器。

例如,

template<typename T>
void CustomDeleter(T *t)
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
delete t;
}

std::vector<std::unique_ptr<A, void(*)(A *)>> myArray;

myArray.push_back(
std::unique_ptr<A, void(*)(A *)>(new A(), [](A *a){
CustomDeleter(a); }));
myArray.push_back(
std::unique_ptr<A, void(*)(A *)>(new B(), [](A *a){
CustomDeleter(static_cast<B*>(a)); }));
myArray.push_back(
std::unique_ptr<A, void(*)(A *)>(new C(), [](A *a){
CustomDeleter(static_cast<C*>(a)); }));

vector超出范围,打印:

void CustomDeleter(T*) [with T = A]
void CustomDeleter(T*) [with T = B]
void CustomDeleter(T*) [with T = C]

Live demo

关于c++ - 多态 unique_ptr 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24808483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com