C++ 如何将返回unique_ptr的函数转换为原始指针?
假设我要使用的遗留库中有一个函数需要函数指针作为输入C++ 如何将返回unique_ptr的函数转换为原始指针?,c++,c++11,pointers,C++,C++11,Pointers,假设我要使用的遗留库中有一个函数需要函数指针作为输入 void LegacyFunction(int* (*func)(float, float), int a, float b); 但问题是,它期望函数的返回值是int-raw指针,而不是int-unique_ptr,这意味着只有在函数看起来像 int* MyFunc(float a, float b); 换句话说,如果我将MyFunc修改为 std::unique_ptr<int> MyFunc(float a, float
void LegacyFunction(int* (*func)(float, float), int a, float b);
但问题是,它期望函数的返回值是int-raw指针,而不是int-unique_ptr,这意味着只有在函数看起来像
int* MyFunc(float a, float b);
换句话说,如果我将MyFunc修改为
std::unique_ptr<int> MyFunc(float a, float b);
将出现编译错误。我知道如果函数使用的是普通的int指针,那么可以使用get()
函数
LegacyFunction(MyFunc, 1, 2.0f);
std::unique_ptr<int> a;
LegacyFunctionRawPointer(a.get(), 1, 2.0f);
std::unique_ptr a;
LegacyFunctionRawPointer(a.get(),1,2.0f);
对于函数指针输入是否有类似的解决方法?如果我必须用原始指针替换MyFunc的唯一\u ptr,那将是一种讽刺。lambda函数应该可以工作,例如:
LegacyFunction([](float a, float b) { return MyFunc(a, b).release(); }, 1, 2.0f);
但只有当LegacyFunction
会自然删除/释放MyFunc
分配给相应操作的内存时(因此,如果MyFunc
使用new int
,LegacyFunction
必须使用delete retval;
;如果使用new int[x]
,则必须使用delete[]retval;
)
获取包含的指针并放弃所有权,因此您已明确放弃了
unique\u ptr
的保护;如果可以避免,这不是一个好主意。lambda函数应该可以工作,例如:
LegacyFunction([](float a, float b) { return MyFunc(a, b).release(); }, 1, 2.0f);
但只有当LegacyFunction
会自然删除/释放MyFunc
分配给相应操作的内存时(因此,如果MyFunc
使用new int
,LegacyFunction
必须使用delete retval;
;如果使用new int[x]
,则必须使用delete[]retval;
)
获取包含的指针并放弃所有权,因此您已明确放弃了
unique\u ptr
的保护;如果可以避免,这不是一个好主意。MyFunc是运行时值还是在编译时已知?谁拥有指针?legacy library是所有者吗?遗留库是否破坏了指针?一个简单的lambda函数包装器似乎可以工作,但是,如果旧版没有以分配的方式释放返回的内存,您将有内存泄漏。您可以将MyFunc
包装在lambda中。@krzaq编译时已知的是MyFunc
运行时值,还是编译时已知的?谁拥有指针?legacy library是所有者吗?旧式库是否破坏了指针?一个简单的lambda函数包装器似乎可以工作,但如果旧式库没有以分配的相同方式释放返回的内存,则会导致内存泄漏。您可以在lambda中包装MyFunc
。@krzaq编译时就知道了