gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:21:47 28 4
gpt4 key购买 nike

我正在使用 Qt 并尝试通过应用 this 来实现单实例应用程序Linux(ubuntu) 中的解决方案。问题是,如果应用程序意外结束(段错误或用户终止它),共享内存仍然保持连接状态,没有其他进程可以再次创建它。从 QSharedMemory 文档中记忆:

Unix: QSharedMemory "owns" the shared memory segment. When the lastthread or process that has an instance of QSharedMemory attached to aparticular shared memory segment detaches from the segment bydestroying its instance of QSharedMemory, the Unix kernel release theshared memory segment. But if that last thread or process crasheswithout running the QSharedMemory destructor, the shared memorysegment survives the crash.

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();
}

您可以在这里提出哪些解决方案?我如何确保在进程最终完成后共享内存被清除(或通常使用的任何动词)。我在 java 中围绕主要功能需要类似 finally 的东西:/

编辑:(解决方案)

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

最佳答案

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

关于C++共享内存泄漏,如何清除共享内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7773276/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com