如何在程序崩溃后释放managedsharedmemory:在调试过程中使用哪些有效的技术



无可否认,我是一个自学成才的程序员,终于开始涉足C和C++的深度和力量。这种自我学习过程中附带的一些东西不是教科书或公开的谷歌知识,比如在困难环境中使用的技巧和调试策略。

我正在使用boost::interprocess来使用managed_shared_memory和命名对象设置共享内存。不出所料,在我的开发过程中,由于许多原因,我的程序到处崩溃。到目前为止,我对调试工具相当陌生,尤其是在linux中。因此,很多时候我的共享内存没有被正确删除,因为崩溃可能导致析构函数永远不会被调用,等等。

因此,在这样的程序崩溃之后,当我试图再次运行我的应用程序时,当我的代码疲于分配新的共享内存段时,我会看到这样的消息:

terminate called after throwing an instance of 'boost::interprocess::interprocess_exception'
what():  boost::interprocess_exception::library_error

据我所知,这是挥之不去的同名共享记忆的结果,这种记忆从未关闭,现在已经变得无赖。我试过使用

open_or_create

标志,希望我的程序的后续实例能够重新连接共享内存,然后我可以找到/清除段中以前的对象,并像重新运行一样重新开始。然而,这并没有发生。我的应用程序抛出上述错误或挂起,并且我无法继续进行后续的程序运行尝试。

什么是在这样的崩溃后清除共享内存的有效方法,这样我就可以在编辑/重建应用程序后再次运行?

现在,我唯一能做的就是尽我所能避免这些撞车事故。但当崩溃确实发生时,我现在所知道的如何再次成功运行的就是首先重新启动。耗时、笨拙,当然也缺乏经验丰富的程序员所能做的最佳事情

如有任何建议,我们将不胜感激!谢谢B

编辑:关于如何进行ipcsipcrm,有什么具体的建议吗?

在新启动时,我可以再次运行ipcs,然后是我的应用程序,然后是ipcs(当我的应用仍然打开,共享内存仍然可以访问时),我看不出任何共享内存段有什么不同。

我正在用一个看起来像的语句分配内存

managed_shared_memory segment(open_or_create, "sharedMemtest", 1048588)

添加

shared_memory_object::remove("sharedMemtest");

在之前

managed_shared_memory segment(open_or_create, "sharedMemtest", 1048588);

最新更新