C++ std::shared_ptr与std::函数作为自定义删除器和分配器
有没有办法让这一切顺利进行C++ std::shared_ptr与std::函数作为自定义删除器和分配器,c++,c++14,shared-ptr,std-function,C++,C++14,Shared Ptr,Std Function,有没有办法让这一切顺利进行 #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 cha
#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;
}
#包括
#包括
int main()
{
函数分配器
=[](大小\u t大小){
返回新的无符号字符[size];
};
函数删除器
=[](无符号字符*ptr){
删除[]ptr;
};
std::shared_ptr mem(大小、删除器、分配器);
返回退出成功;
}
我得到一个错误:
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);
^~~~~~~~~
main.cpp:在函数“int main()”中:
main.cpp:15:49:错误:“deleter”不是类型
std::shared_ptr mem(大小、删除器、分配器);
^~~~~~~
main.cpp:15:57:错误:“分配器”不是类型
std::shared_ptr mem(大小、删除器、分配器);
^~~~~~~~~
更多背景:
我有一个模板类,它保存了一些内存。这是通过使用自定义分配器和删除器创建的共享_ptr完成的。分配器和删除器不是类的模板参数
现在我想给类添加一个resize方法。我希望避免需要提供新的分配器和Delter,并希望将它们保存在
std::function
分配器不应该处理您的数据分配,它应该处理共享的\u ptr
内部数据的分配
您需要将已经分配的数据作为第一个参数提供给构造函数<代码>共享\u 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;
}
#包括
#包括
int main()
{
函数删除器
=[](无符号字符*ptr){
删除[]ptr;
};
std::shared_ptr mem(新的无符号字符[5],deleter);
返回退出成功;
}
如果可以,您应该更喜欢lambda而不是std::function,它让编译器可以进行优化。分配器不应该处理您的数据分配,它应该处理
共享的内部数据的分配
您需要将已经分配的数据作为第一个参数提供给构造函数<代码>共享\u 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;
}
#包括
#包括
int main()
{
函数删除器
=[](无符号字符*ptr){
删除[]ptr;
};
std::shared_ptr mem(新的无符号字符[5],deleter);
返回退出成功;
}
如果可以的话,您应该更喜欢lambda而不是std::function,它让编译器可以进行优化。我发现我看错了api。在创建任何有效的示例之前,我必须阅读更多关于如何将
std::shared_ptr
与自定义分配和deleter一起使用的内容。您正沦为一个最烦人的解析的牺牲品。发生错误的原因是shared\u ptr mem(size_t,
看起来像函数声明的开头,但是您提供了标识符deleter
,它不是一个类型,因此它不能是函数声明。但是鉴于前面的文本,代码行也不是函数调用。我发现我误读了api。我必须阅读更多关于使用std::shared的信息_在我创建任何有效示例之前,使用自定义分配和deleter进行ptr
。您正陷入一个最麻烦的解析中。出现错误的原因是共享\u ptr mem(size_t,
看起来像函数声明的开头,但随后您提供了标识符deleter
,该标识符不是类型,因此它不能是函数声明。但鉴于前面的文本,代码行也不是函数调用。