从通过DLSYM执行的函数返回unique_ptr
Returning unique_ptr from a function executed via dlsym
i具有一个位于共享对象中的函数,并从主程序中加载和执行dlsym
。(共享对象和主要程序都是C (
此功能可能会返回std::unique_ptr
?
共享对象函数 -
extern "C" {
unique_ptr<Obj> some_function() {
return make_unique<Obj>();
}
}
主要程序:
void main_flow() {
auto handle = dlopen(...);
FuncPtr func = dlsym(handle, "some_function");
unique_ptr<Obj> func();
}
是的,是,有很多警告。首先,在DSO接口中使用Boost或STL有点危险。
- std :: unique_ptr在编译器之间有所不同
- std :: unique_ptr在C 版本之间有所不同
- std :: unique_ptr在调试/发布构建之间可能有所不同。
这意味着,如果您在DSO接口中使用STL或Boost,则所有EXES和DSO都必须使用相同的构建标志(如果是您的事物(使用相同的构建标志的C 运行时版本完全相同。
我建议在Visual Studio上使用警告级别4,它将在您的DSO接口中很好地列出上述所有问题(如C4251警告(
至于您的问题,是的,该函数将返回std :: unique_ptr,但是您现在正在在DSO中分配内存,您可能会在EXE中释放它。在Windows世界中,这可能非常糟糕,您可能会发现调试构建具有不同的堆。试图在EXE堆中释放DSO分配的对象会丢弃运行时错误,但通常仅在调试构建中。
您的主要人物应该像这样:
void main_flow() {
auto handle = dlopen(...);
FuncPtr func = (FuncPtr)dlsym(handle, "some_function");
unique_ptr<Obj> obj = func();
}
就个人而言,我建议您只返回一个裸露的指针,然后在您的EXE中对其进行Make_unique。尽管您可能会被堆问题咬伤(除非您将类型类型的deStructor咬伤(
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- 为什么 std::unique 不调用 std::sort?
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何取消对nullptr的屏蔽,返回正确的对象
- 奇怪的结构&GCC&clang(void*返回类型)
- 从 std::unique 返回的迭代器的用法
- SQLite INSERT 命令返回错误"column number is not unique"
- 返回c++中的unique()函数