Я реализую некоторую сложную структуру данных в C, поддерживающую различные операции. Эта структура данных использует много других динамических структур (графы, деревья AVL, связанные списки), и все использует динамическую память.
При выполнении какой-либо операции, например, вставки в мою структуру данных, очевидно, что мне приходится выделять память, иногда большую ее часть (поэтому структура увеличивается). Это может привести к нехватке памяти (malloc () возвращает NULL) в середине выполнения некоторой операции. Теперь я хотел бы не завершать свою программу, но сообщить вызывающему оператору, что операция завершилась неудачно, и позволить вызывающему продолжить выполнение.
Моя проблема заключается в том, что, когда операция завершается неудачей в середине ее выполнения из-за сбоя выделения памяти, я хотел бы отменить то, что было сделано с момента вызова операции, отменить эти изменения в структуре данных, чтобы эта операция была никогда не вызывается (поэтому верните структуру данных в состояние прямо перед выполнением операции). Мне это нужно, потому что я хочу, чтобы моя структура данных была в допустимом и пригодном для использования состоянии, даже если операция не удалась, поэтому я могу продолжать ее использовать.
Поскольку структура данных достаточно продвинута, я ищу общие методы, советы и подсказки относительно возврата динамической структуры данных в ее состояние непосредственно перед вызовом операции. Возможно, у вас есть некоторый опыт решения таких проблем, вы слышали об этой проблеме или можете предложить несколько книг / статей, касающихся ее или связанных исходных кодов.
РЕДАКТИРОВАТЬ: немного упрощенный пример будет установлен <> из C ++. Согласно документации STL, set :: insert работает хорошо, даже когда генерируется исключение, поэтому он каким-то образом способен отменить изменения, сделанные во время выполнения set :: insert, даже если базовая структура данных набора (вероятно, красно-черные деревья) достаточно продвинута .
Цитата из cplusplus.com: «Если нужно вставить один элемент, в случае исключения изменения в контейнере отсутствуют (строгая гарантия).
В противном случае контейнер гарантированно завершится в действительном состоянии (базовая гарантия). "