2016-06-10 2 views
0

По общему признанию, я начинающий и самонаводящийся программист, и, наконец, углубляюсь в глубины и мощь 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) 
+0

О * NIX систем, я хотел бы попробовать 'ipcs' и 'ipcrm'. – user3386109

+0

C/C++ не является языком. Вы пишете C++. –

+1

@ user3386109, спасибо, я рассмотрю те – brneuro

ответ

-1

Добавить

shared_memory_object::remove("sharedMemtest"); 

, прежде чем ваш

managed_shared_memory segment(open_or_create, "sharedMemtest", 1048588); 
+0

Не могли бы вы дать более подробную информацию? – Idan

+0

может использовать функцию построения при открытии shm; 1. используйте remove 2. segement find_or_construct вместо функции построения – Eric

+0

Это просто отзыв о том, как вы ответили на вопрос. Попробуйте изменить свой вопрос, чтобы добавить все детали, которые могут понадобиться SO. Попробуйте и просмотрите до: http://stackoverflow.com/help/how-to-answer – Idan

Смежные вопросы