По общему признанию, я начинающий и самонаводящийся программист, и, наконец, углубляюсь в глубины и мощь C и C++. Некоторые вещи, которые приходят с этим процессом самообучения, - это не учебник или откровенно googleable знания, такие как трюки для использования в сложных обстоятельствах и стратегии отладки.Как освободить managed_shared_memory после сбоя программы: какие эффективные методы использовать во время отладки?
Я использую boost :: interprocess для настройки общей памяти с помощью управляемых_shared_memory и именованных объектов. Неудивительно, что моя программа вылетает здесь и там по ряду причин во время моего развития. До сих пор я не знаком с инструментами отладки, особенно в Linux. Как следствие, много раз моя общая память не удаляется должным образом, так как сбой может привести к тому, что деструкторы никогда не вызываются и т. Д.
Итак, после такого сбоя программы, когда я пытаюсь запустить приложение снова, когда мой код шины выделить новый сегмент разделяемой памяти, когда я вижу сообщения, как:
terminate called after throwing an instance of 'boost::interprocess::interprocess_exception'
what(): boost::interprocess_exception::library_error
, который я понимаю, является результатом затяжного разделяемой памяти с тем же именем, что никогда не был закрыт, и теперь изгоев. Я попытался с помощью флага
open_or_create
в моем заявлении, в надежде, что последующие экземпляры моей программы будет восстановить эту общую память, и тогда я мог бы найти/удалить предыдущие объекты в сегменте, и начать все сначала, как если бы это был свежий пробег. Однако этого не происходит. Мое приложение выдает указанную выше ошибку или зависает, и я не могу продолжить последующие попытки запустить мою программу.
Что такое эффективный способ очистки разделяемой памяти после сбоя, так что я могу снова запустить после редактирования/восстановления моего приложения?
Прямо сейчас, единственное, что я могу сделать, это сделать все возможное, чтобы избежать этих сбоев. Но когда происходят сбои, все, что я знаю, как это сделать в настоящий момент, чтобы успешно запустить, - это сначала перезагрузка. Много времени, и неудобно, и, конечно, не хватает чего-то оптимального, которого мог бы сделать более опытный программист.
Любые предложения будут оценены! Спасибо, B
EDIT: Есть ли какие-либо конкретные советы, как поступить с ipcs
и ipcrm
?
В новой загрузке я могу запускать ipcs, затем мое приложение, а затем ipcs во второй раз (пока мое приложение все еще открыто, а доступ к общей памяти все еще доступен), и я не вижу разницы в сегментах разделяемой памяти.
Я выделение памяти с утверждением, что выглядит как этот
managed_shared_memory segment(open_or_create, "sharedMemtest", 1048588)
О * NIX систем, я хотел бы попробовать 'ipcs' и 'ipcrm'. – user3386109
C/C++ не является языком. Вы пишете C++. –
@ user3386109, спасибо, я рассмотрю те – brneuro