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()来实现所需的行为.