gpt4 book ai didi

c++ - 使用内存池中的自定义删除器将 std::unique_ptr 返回到抽象类型

转载 作者:行者123 更新时间:2023-12-05 08:04:24 25 4
gpt4 key购买 nike

假设我有一个模板化的 MemoryPool 类,一个函数 create(...)(它返回一个指向新分配的 T 类型对象的指针)和一个函数 destroy(T*)(它销毁并将内存返回给池)。

我想创建一个 std::unique_ptr,它“拥有”由池创建的指针并将指针返回到池,因此需要自定义删除器。

问题是,如果池包含具体对象并且我想将 std::unique_ptr 传递给该对象的抽象接口(interface),我该如何进行这项工作。

这是一个无法编译的例子:

#include <iostream>
#include <memory>
#include <functional>
#include <utility>

template <typename T>
class MemoryPool {
public:
template <typename ... ARGS>
T* create(ARGS&&... args) {
std::cout << "MemoryPool::create()" << std::endl;

return new T(std::forward<ARGS>(args)...);
}

void destroy(T* ptr) {
std::cout << "MemoryPool::destroy()" << std::endl;

delete ptr;
}
};

class ITest {
public:
ITest() {
std::cout << "ITest::ITest()" << std::endl;
}
virtual ~ITest() {
std::cout << "ITest::~ITest()" << std::endl;
}

virtual void sayHello() = 0;
};

class Test :public ITest {
public:
Test() {
std::cout << "Test::Test()" << std::endl;
}
~Test() {
std::cout << "Test::~Test()" << std::endl;
}

void sayHello() override {
std::cout << "Test says hello" << std::endl;
}
};

class ITestOwner {
public:
ITestOwner(std::unique_ptr<ITest> ptr) :
_ptr(std::move(ptr))
{
std::cout << "ITestOwner::ITestOwner()" << std::endl;
}

~ITestOwner() {
std::cout << "ITestOwner::~ITestOwner()" << std::endl;
}

void sayHello() { _ptr->sayHello(); }

private:
std::unique_ptr<ITest> _ptr;
};

int main() {
MemoryPool<Test> pool;

std::unique_ptr<Test, std::function<void(Test*)>> ptr(pool.create(), [&pool](Test* ptr){
std::cout << "Custom Deleter" << std::endl;
pool.destroy(ptr);
});

ITestOwner owner(std::move(ptr));

owner.sayHello();

return 0;
}

请记住,我真正的 MemoryPool 类实际上将充当普通内存池,而不是像我所做的那样使用 new/delete。

在这个例子中,ITestOwner 应该将 std::unique_ptr 的所有权交给一个 ITest 抽象对象。然后,当ITestOwner被销毁时,智能指针也会被销毁,Test对象应该返回到内存池中。

有没有办法做到这一点?

最佳答案

代码无法编译,因为 std::unique_ptr<ITest>ITestOwner 使用趁你转发std::unique_ptr<Test, std::function<void(Test*)>> .它显然无法编译,因为 std::unique_ptr<ITest>ITest 上调用 delete而不是调用一些复杂的任意函数。

您需要使用 unique_ptr<ITest, function<void(ITest*)>>为了让它工作,另外从 function<void(Test*)> 添加一些难看的转换代码至 function<void(ITest*)> ...我会说这根本不好。 unique_ptr旨在简单高效 - 析构函数应该包装基本功能,但对于复杂的目的来说不够方便。

基本上,unique_ptr不是为这个任务设计的。它应该是轻量级的,并且您已经使用了像 std::function 这样的重功能。这破坏了整个目的。相反,您可以使用 shared_ptr哪种类型删除删除器并将其隐藏 -​​ 因此您无需担心。如果您仍想将用户限制为唯一所有权,您肯定可以找到实现您想要的智能指针的其他第 3 方开源库 - 有很多这样的库。

关于c++ - 使用内存池中的自定义删除器将 std::unique_ptr 返回到抽象类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69182016/

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