在不释放内存的情况下调用共享库

时间:2014-11-26 21:50:30

标签: c++ ubuntu

在Ubuntu 14.04中,我使用C ++ API作为共享库,我使用dlopen打开,然后使用dlsym创建指向函数的指针。其中一个函数CloseAPI从内存中释放API。这是语法:

void* APIhandle = dlopen("Kinova.API.USBCommandLayerUbuntu.so", RTLD_NOW|RTLD_GLOBAL);
int (*CloseAPI) = (int (*)()) dlsym(APIhandle,"CloseAPI");

如果我确保在我的代码中,CloseAPI函数总是在main函数返回之前被调用,那么一切似乎都很好,我可以在下次再次运行该程序。但是,如果我Ctrl-C并在它有时间调用CloseAPI之前中断程序,那么在下次运行程序时,每当我调用任何API函数时都会收到返回错误。我没有文档说明这个错误是什么,但我的直觉是,从上一次运行程序中对库有某种锁定。唯一允许我再次运行程序的是重启我的机器。登录和退出不起作用。

所以,我的问题是:

1)如果我的库是一个共享库,为什么我认为共享库可以同时由多个程序加载时会出现此错误?

2)如果我希望经常发生Ctrl-C而无法拨打CloseAPI,我该如何解决此问题?

1 个答案:

答案 0 :(得分:1)

所以,如果你确实正确地使用了这个api,那么它需要你在使用后进行适当的清理(这不是真正用户友好的)。

首先,如果您确实需要使用Ctrl-C,请允许程序正确结束此信号:Is destructor called if SIGINT or SIGSTP issued?

然后使用包含资源指针的堆栈对象的技术(在本例中为CloseAPI函数)。然后确保此对象将在其析构函数中调用CloseAPI(您可能需要检查之前是否未调用CloseAPI)。请参阅“Effective C ++,第3章:资源管理”中的更多内容。

即使您没有调用CloseAPI,指针容器也会为您执行此操作。

P.S。你应该考虑这样做,即使你不打算使用Ctrl-C。想象一下,发生异常并且你的程序必须停止:那么你应该确保不要让OS处于未定义的状态。