我试图通过std :: bind传递std :: unique_ptr(数组类型),我收到了编译错误。
#include <functional>
#include <memory>
#include <stdio.h>
#include <string.h>
class PrintClass
{
public:
void printFunc(std::unique_ptr<char[]> text)
{
printf("Printed text %s\n", text.get());
}
};
int main()
{
std::unique_ptr<PrintClass> printObj(new PrintClass);
std::unique_ptr<char[]> buffer(new char[1024]);
strcpy(buffer.get(),"Test data");
std::function<void()> fn = std::bind(&PrintClass::printFunc,
printObj.get(), std::move(buffer));
fn();
}
这将返回以下编译器错误:
test.cpp:在函数
int main()
中: test.cpp:21:98:错误:从std::_Bind_helper<false, void (PrintClass::*)(std::unique_ptr<char []>), PrintClass*, std::unique_ptr<char [], std::default_delete<char []> > >::type {aka std::_Bind<std::_Mem_fn<void (PrintClass::*)(std::unique_ptr<char []>)>(PrintClass*, std::unique_ptr<char []>)>}
转换为非标量类型std::function<void()>
请求 std :: function fn = std :: bind(&amp; PrintClass :: printFunc,printObj.get(),&gt; std :: move(buffer));
我正在编译:
g++ -std=c++11 ...
我可以使用原始指针但是我冒着内存泄漏的风险。那么如何通过std :: bind接口传递缓冲区的所有权?
我在这里使用字符串来说明我的观点。我真正的问题涉及传递二进制内存缓冲区,我想确保不泄漏。
请忽略使用strcpy而不进行数组边界检查,我只是想把一些东西拼在一起来说明我的问题。