C++共享内存泄漏,如何清除共享内存?

des*_*tan 5 c++ qt memory-leaks memory-management shared-memory

我正在使用Qt并尝试通过在Linux(ubuntu)中应用解决方案来实现单实例应用程序.问题是,如果应用程序意外完成(seg.错误或用户杀死它),共享内存将保持连接状态,其他任何进程都无法再次创建它.回想一下QSharedMemory doc:

Unix:QSharedMemory"拥有"共享内存段.当具有附加到特定共享内存段的QSharedMemory实例的最后一个线程或进程通过销毁其QSharedMemory实例而从该段中分离时,Unix内核将释放共享内存段.但是如果最后一个线程或进程在没有运行QSharedMemory析构函数的情况下崩溃,那么共享内存段将在崩溃中幸存下来.

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // Ensure single instanse of Cevirgec application
    QSharedMemory shared(ApplicationConstants::

    if( !shared.create( 512, QSharedMemory::ReadWrite) )
    {
      // QMessageBox msgBox;
      QMessageBox::critical(0, QObject::tr("application is already running!"), QObject::tr("application is already running!"), QMessageBox::Ok, QMessageBox::Ok);
      qCritical() << "application is already running!";

      exit(0);
    }
    else {
        qDebug() << "application staring...";
    }
    return a.exec(); 
}
Run Code Online (Sandbox Code Playgroud)

你能在这里建议什么解决方案?在流程最终​​完成后,如何确保共享内存被清除(或者通常使用的任何动词).我需要像finallyjava这样的主要功能:/

编辑:(解决方案)

我已经通过使用QSharedMemory并捕获SIGSEGV信号然后在信号处理程序中调用sharedMemory.detach()来实现所需的行为.

bam*_*s53 5

您可以捕获导致程序崩溃的信号,并使用调用QSharedMemory析构函数的处理程序.