Хотя документация не нуждается в явном изложении этого, совершенно очевидно, что то, что вы делаете, - это "неопределенное поведение" (в рамках библиотеки).
Так же, как delete
с динамически распределенной памятью, вы должны завершить один раз .Не дважды, не пять раз, а один раз .После того, как вы завершили подготовленное заявление, оно было «удалено» и больше не существует.Любые дальнейшие операции с этим подготовленным оператором представляют собой то, что в документации называется «серьезной ошибкой» (если мы предположим, что избыточный вызов finalize
означает «использование»; а почему бы и нет?).
К счастью, есть нет причин когда-либо хотеть сделать это.Так просто, не надо!Если ваш дизайн таков, что вы потеряли контроль над потоком кода и в точке finalize
по какой-то причине у вас недостаточно информации о контексте вашей программы, чтобы узнать, был ли подготовленный оператор уже завершен, это прекрасно: многокак мы делаем с указателями, вы можете установить его на nullptr
, чтобы последующие вызовы не выполнялись.Но если вам нужно , чтобы сделать это, вам действительно следует пересмотреть свой дизайн.
Почему он работает для вас?Чистый шанс, очень похожий на любое другое неопределенное поведение:
Любое использование подготовленного оператора после его завершения может привести к неопределенному и нежелательному поведению, такому как ошибки сегмента и повреждение кучи.
См. Также: «Почему я не могу дважды закрыть дверцу машины, не открывая ее?» и «Почему я не могу сбрить воображаемую бороду?»