Пытался оставить это в комментариях, но то, что я говорил, слишком долго и начало нуждаться в форматировании.
В строковых объектах Ada обычно предполагается идеальный размер. Язык предоставляет функции для возврата размера и границ любой строки. Из-за этого обработка строк в Ada очень отличается от C, и на самом деле больше напоминает то, как вы это делаете на функциональном языке, таком как Lisp.
Но основной принцип заключается в том, что, за исключением некоторых очень необычных ситуаций, , если вы обнаружите, что используете Ada.Strings.Unbounded
, вы поступаете неправильно.
Единственный случай, когда вы действительно не можете обойтись, используя строку переменной длины (или, возможно, буфер с отдельной переменной valid_length), - это когда строки считываются как входные данные из какого-либо внешнего источника. Как вы говорите, ваш пример анализа - такая ситуация.
Однако даже здесь вы должны иметь такую ситуацию только в исходном буфере. Ваш вызов в вашу процедуру Parse должен выглядеть примерно так:
Ada.Text_IO.Get_Line (Buffer, Buffer_Len);
Parse (Buffer(Buffer'first..Buffer'first + Buffer_Len - 1));
Теперь внутри процедуры Parse у вас есть константа Ada идеального размера для работы. Если по какой-либо причине вам нужно вытащить сублиме, вы должны сделать следующее:
... --// Code to find start and end indices of my subslice
New_Element : constant String := Str(Element_Start...Element_End);
Если вам по какой-то причине вам не нужно делать копию этих данных, вам лучше просто найти Element_Start
и Element_End
и поработать с фрагментом исходного строкового буфера. Например:
if Str(Element_Start..Element_End) = "MyToken" then
Я знаю, что это не отвечает на ваш вопрос об Ada.Strings. Неограниченный, возможно, утечка. Но даже если он не протекает, этот код относительно бесполезен для машинных ресурсов (ЦП и памяти) и, вероятно, не должен использоваться для манипулирования строками, если вам действительно не нужно .