Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::shared_ptr与std::函数作为自定义删除器和分配器_C++_C++14_Shared Ptr_Std Function - Fatal编程技术网

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
,该标识符不是类型,因此它不能是函数声明。但鉴于前面的文本,代码行也不是函数调用。