Утечка общей памяти C ++, как очистить общую память?

Я использую Qt и пытаюсь создать приложение с одним экземпляром, применяя это решение в Linux (убунту) . Проблема в том, что если приложение неожиданно завершает свою работу (сегмент. Ошибка или пользователь убивает его), разделяемая память остается подключенной, и никакой другой процесс не может создать ее снова. Вспомните из документа QSharedMemory:

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

Какие решения вы можете здесь предложить? Как я могу гарантировать, что общая память очищается (или любой другой используемый глагол) после того, как процесс в конечном итоге завершится. Мне нужно что-то вроде finally в java вокруг основной функции: /

EDIT: (Решение)

Я добился желаемого поведения, используя QSharedMemory и перехватив сигнал SIGSEGV, затем вызываю sharedMemory .detach () в обработчике сигналов.

5
задан Community 23 May 2017 в 12:05
поделиться