询问一个撰写c++ shared library (.so) 给 client使用的问题
看到一份code, .so 的header 提供的api prototype是长这样
std::unique_ptr<Foo> CreateFoo();
这很明显的是
allocate的动作在lib里面
deallocate的人一定在caller那端也就是client code
a. 这是不是一个很不正确的design?
基于一个观念
不该把new跟delete的动作, 在不同library间执行
之前观念是因为heap是独立的, 所以会出问题
b. 但这观念是不是只有windows上才有呢? 不确定
以下连结也只提到dll
https://stackoverflow.com/questions/443147/c-mix-new-delete-between-libs
针对这件事 我并没有明确的google到有什么guideline提到该怎么设计
如果是以我经验来说
多半是
Foo* Create() 搭配 void Release(Foo*)
但这感觉比较偏向C, 而这样好像也限制client端得到这个Foo*后无法用smart pointer去
hold.
所以以我的想法会觉得
回传
weak_ptr<Foo> or shared_ptr<Foo> Create(); 给client
然后Create函数里面实作的时候使用一个global之类的container,
把这sp记录起来确保 .so是最后一个去delete他的人
但这边衍伸一个疑问
c. a.exe + b.so 使用load time dynamic link的话,
a.exe还是b.so的global变量会先开始解构?
如果是使用 run time dynamic link的话
d. 如果client用dlopen 然后dlsym拿到一个sp后
手动呼叫dlclose....这时候继续使用这个sp 是不是会有undefined的行为产生?
就算没有人解构可是.so已经被close了?
e. 不能在不同的library间 new delete这件事 是否是platform/compiler dependent?
假设linux上如果我测试发现没有出问题 是否表示在这compiler/platform下
100%不会发生问题
还是说"有可能" 不定时的出现问题 而不能马上当下发现立刻修正?
因为目前使用那个shared library(return unique ptr)并没发生问题
会不会之后在某特定情况下突然出现问题呢?
会有 lib 间 heap是独立的这件事 是gcc / vc实作决定的吗 还是更底层 OS实作?
f. 以我的观念来看 如果是.a 的static lib, 是不是就完全没有design上特别的考量
不需要特别去因为写static library而有特别需要注意的地方?
g. 如果一个exe使用多个.so 而这些.so都用不同版本的gcc build出来的
这样如果他们expose的api 含有 stl的type
是不是就是一个非常不好的design?
如果我真的要使用这些不同版本的.so 是不是只能祈祷不会出事情而无法作解决?
而这问题是不是只要这些.so用dynamic link libstdc++就没事了?
h. 有没有什么网页有特别针对shared library的interface design 有提供guideline?
想要稍微go through一下比较能掌握一些必要观念
以上几个问题有点复杂 请教各位
非常感谢
一个 process 一个 heap。跟 lib 无关
作者:
LPH66 (-6.2598534e+18f)
2018-08-23 08:49:00unique_ptr 可以提供 Deleter 用来释放所以如果真的要的话其实是可以 (1) library 实做 Deleter或是 (2) 在 Create/Release 的 API 下写个 Deleter 呼叫
整体来讲是一个heap但是module间heap到底是不是独立这件事到底谁决定的?
@lph66: 想一下 如果没有刻意给deletor他会带入用default deletor ,这样不也是让delete的动作 做在自己身上?所以其实也没问题 是吗
作者: AstralBrain 2018-08-23 19:10:00
default_deletor应该会inline展开成delete不会回你的shared lib执行啊.. 只要你的class有实作operator delete就ok可以让他link到lib里面的那一份
这件事也太多眉角了,谁知道到底会不会inline呢@@为什么说default会被inline, custom的就不会呢?
作者: AstralBrain 2018-08-23 22:45:00
inline有个大前提是要能在compile time看到实作你把实作藏在so里面他想inline也办法
作者:
cole945 (跶跶..)
2018-08-23 22:57:00STL本来就是看source code在编的, 不是吗@@?
作者:
saladim (杀拉顶)
2018-09-01 03:16:00好像函数回传smart pointer是提示说使用者不用管release的问题 若回传raw pointer那就有几种状况 可能需要搭配lib提供者的release function, 或是实务上也遇过使用者不需要做任何事的设计 得看lib的设计, 至于本篇其他问题还要再研究一下 XD 头痛