删除动态库类对象错误

JackPan 2013-04-01 05:02:05
动态库 CAPP.so代码大概是下面这样

static CAPP *g_poAPP = 0;

extern "C"
{
void *NewAPP()
{
if (NULL == g_poAPP)
{
g_poAPP = new CAPP();
}

return g_poAPP;
}

void DeleteAPP()
{
if (NULL != g_poAPP)
{
delete g_poAPP;
g_poAPP = NULL;
}
}
}

CAPP是个类;

调用dlopen->调用NewAPP()-调用DeleteAPP()->调用dlclose(),正常运行没问题。但是当我用新CAPP.so替换旧的CAPP.so文件的时候(在NewAPP执行完之后替换),在调用DeleteAPP()时出错Segmentation fault。
...全文
128 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ghost5216 2013-04-02
  • 打赏
  • 举报
回复
不知道几位说的是什么 .so???/
JackPan 2013-04-02
  • 打赏
  • 举报
回复
1.调用dlopen->调用NewAPP()->调用APP类成员函数->调用DeleteAPP()->调用dlclose()->从头再来。 2.调用dlopen->调用NewAPP()->调用APP类成员函数->替换动态库->调用DeleteAPP()->调用dlclose()->从头再来。 简单的说第1种没问题,第2种有问题。
JackPan 2013-04-02
  • 打赏
  • 举报
回复
进程在线更新动态库问题:一个进程加载了某动态库,现在要更新动态库,有下面几种方法: 1.直接用新的动态库覆盖掉旧的动态库 2.删除旧库,cp新库,发信号给进程更新库 3.把旧库改成其它名字,cp新库,发信号给进程更新库 第2和3没问题,第1种方法,只要一覆盖,进程就挂了
JackPan 2013-04-02
  • 打赏
  • 举报
回复
主要是为了实现在不关闭程序情况下动态加载卸载动态库。 已经知道原因了,替换动态库->调用DeleteAPP() 交换下顺序就没问题了。
ForestDB 2013-04-02
  • 打赏
  • 举报
回复
基本上不能保证新旧.so的内存对象模型是一致的。
heartlesstoanyone 2013-04-01
  • 打赏
  • 举报
回复
gdb信息呢? 应该先dlcose之后,再替换并加载so文件。

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧