gpt4 book ai didi

c++ - 具有std::function的std::shared_ptr作为自定义删除器和分配器

转载 作者:行者123 更新时间:2023-12-02 10:23:05 24 4
gpt4 key购买 nike

有没有办法使这项工作?

#include <functional>
#include <memory>
int main()
{
std::function<unsigned char*(size_t)> allocator
= [](size_t size){
return new unsigned char[size];
};
std::function<void(unsigned char*)> deleter
= [](unsigned char* ptr){
delete[] ptr;
};
std::shared_ptr<unsigned char[]> mem(size_t,deleter,allocator);
return EXIT_SUCCESS;
}

我得到错误:
main.cpp: In function ‘int main()’:
main.cpp:15:49: error: ‘deleter’ is not a type
std::shared_ptr<unsigned char[]> mem(size_t,deleter,allocator);
^~~~~~~
main.cpp:15:57: error: ‘allocator’ is not a type
std::shared_ptr<unsigned char[]> mem(size_t,deleter,allocator);
^~~~~~~~~

更多背景信息:

我有模板类,其中包含一些内存。这是通过shared_ptr完成的,shared_ptr是使用自定义的分配器和删除器创建的。分配器和删除器不是该类的模板参数。

我现在想向类添加一个调整大小的方法。我想避免需要提供新的Allocator和Delter并将其保存在 std::function中。

最佳答案

分配器不应该处理您的数据分配,它应该处理shared_ptr内部数据的分配。

您需要将已经分配的数据作为构造函数的第一个参数提供。 shared_ptr只关心内存清理。

此外,shared_ptr的模板参数必须是没有间接类型的类型。

#include <functional>
#include <memory>
int main()
{
std::function<void(unsigned char*)> deleter
= [](unsigned char* ptr){
delete[] ptr;
};
std::shared_ptr<unsigned char> mem(new unsigned char[5], deleter);
return EXIT_SUCCESS;
}

如果可以的话,您应该首选lambda而不是 std::function,这使编译器可以进行优化。

关于c++ - 具有std::function的std::shared_ptr作为自定义删除器和分配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59209925/

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