我无法创建 returns a unique_ptr 函数的函数指针
I cannot create a function pointer of a function that returns a unique_ptr
我想在 运行 时调用动态库中的函数。该函数 return 是一个指向动态分配对象的指针(我将下面的代码简化为一个 int)。
我希望下面的代码将此指针存储到此对象,以便我随意使用该对象。
#include <dlfcn.h>
#include <memory>
/* myFunction() is supposed to be in my dynamic library */
std::unique_ptr<int> myFunction()
{
return std::unique_ptr<int>(new(int));
}
int main(int argc, char *argv[])
{
int *(*functionPtr)() = nullptr;
void *handle = dlopen(argv[1], RTLD_NOW);
int *symbolAddress = static_cast<int *>(dlsym(handle, "myFunction"));
*(int **)(&functionPtr) = symbolAddress;
int *x = functionPtr();
//std::unique_ptr<int> x = functionPtr();
return 0;
}
上面的代码可以编译,但我写了函数 myFunction 的 return 类型是 "int *"(在主函数中),这在我的库中的函数声明中不是这种情况。
PS :在 post 中,我调用 "object" 类型 "int" 来简化,在我的示例中。
我的最终目标是取消对最后一行的注释。
我可能做错了事。我仍在学习语言,但我想正确编码,所以我愿意重组我的代码。
myFunction
的类型是std::unique_ptr<int> ()
。因此,指向 myFunction
的指针的类型是 std::unique_ptr<int> (*)()
。这正是 functionPtr
应该声明的方式:
std::unique_ptr<int> (*functionPtr)();
另外:
*(int **)(&functionPtr) = symbolAddress;
这种类型双关的写入违反了 C 和 C++ 中的严格别名,我不确定为什么 symbolAddress
是 int *
。您的代码可能如下所示:
void *symbolAddress = dlsym(handle, "myFunction");
functionPtr = (std::unique_ptr<int>(*)())symbolAddress;
我想在 运行 时调用动态库中的函数。该函数 return 是一个指向动态分配对象的指针(我将下面的代码简化为一个 int)。
我希望下面的代码将此指针存储到此对象,以便我随意使用该对象。
#include <dlfcn.h>
#include <memory>
/* myFunction() is supposed to be in my dynamic library */
std::unique_ptr<int> myFunction()
{
return std::unique_ptr<int>(new(int));
}
int main(int argc, char *argv[])
{
int *(*functionPtr)() = nullptr;
void *handle = dlopen(argv[1], RTLD_NOW);
int *symbolAddress = static_cast<int *>(dlsym(handle, "myFunction"));
*(int **)(&functionPtr) = symbolAddress;
int *x = functionPtr();
//std::unique_ptr<int> x = functionPtr();
return 0;
}
上面的代码可以编译,但我写了函数 myFunction 的 return 类型是 "int *"(在主函数中),这在我的库中的函数声明中不是这种情况。
PS :在 post 中,我调用 "object" 类型 "int" 来简化,在我的示例中。
我的最终目标是取消对最后一行的注释。
我可能做错了事。我仍在学习语言,但我想正确编码,所以我愿意重组我的代码。
myFunction
的类型是std::unique_ptr<int> ()
。因此,指向 myFunction
的指针的类型是 std::unique_ptr<int> (*)()
。这正是 functionPtr
应该声明的方式:
std::unique_ptr<int> (*functionPtr)();
另外:
*(int **)(&functionPtr) = symbolAddress;
这种类型双关的写入违反了 C 和 C++ 中的严格别名,我不确定为什么 symbolAddress
是 int *
。您的代码可能如下所示:
void *symbolAddress = dlsym(handle, "myFunction");
functionPtr = (std::unique_ptr<int>(*)())symbolAddress;