Я знаю, что это не безопасно для malloc
или же free
вызываться, прямо или косвенно, из обработчика сигнала.
Но если я могу гарантировать, что хотя бы одна общая ссылка останется в живых, тогда безопасно ли копировать-конструировать и уничтожать дополнительные общие или слабые ссылки, или мне нужно выполнить мой собственный пересчет?
(Да, я знаю обработчики сигналов обычно не должен делать много. Но на этот раз у меня есть веская причина.)
Стандарт C ++ определяет концепцию «простой старой функции» следующим образом:
POF («простая старая функция») — это функция, которая использует только функции из общего подмножества [C / C ++] и которая прямо или косвенно не использует какую-либо функцию, которая не является POF, за исключением того, что она может использовать обычную блокировку. бесплатные атомные операции.
Более того:
Поведение любой функции, кроме POF, используемой в качестве обработчика сигнала в программе на C ++, определяется реализацией.
Очевидно, что объекты класса C ++ не являются частью общего подмножества C / C ++, и поэтому их использование в обработчике сигналов приводит к поведению, определяемому реализацией.
Теперь многие реализации позволят вам ограниченно использовать возможности C ++. Если ваша реализация не разрешает выделение памяти или исключения, то вот что мы знаем об этих типах интеллектуальных указателей.
Тогда все weak_ptr
конструкторы явно объявлены noexcept
, Поэтому они не могут бросать исключения. Это также означает, что им не разрешается выделять память (так как отказ выделить память вызовет исключение). Да, они могли бы выделить память и std::terminate
если это не удастся, но это будет очень грубо для реализации.
копия&переместить конструкторы shared_ptr
аналогично noexcept
То же самое относится и к. Это также верно для конструктора псевдонимов для shared_ptr
,
Если ты абсолютно уверен что хотя бы один shared_ptr
будет существовать, а затем уничтожить shared_ptr
явно указано, чтобы не иметь побочных эффектов. Что, вероятно, включает в себя освобождение памяти.
Это те гарантии, которые дает вам стандартная библиотека.
Других решений пока нет …