PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Закрывать ли рег.выр.?


Закрывать ли рег.выр.?

Сообщений 1 страница 2 из 2

1

Есть функция FreeRegularExpression(), но во многих примерах она не используется, так как в справке написано, что при закрытии все открытые  освобождаются автоматически. Но интересует если использовать рег.выр. на тот же самый, будем называть дескриптор, допустим 0, предыдущий надо закрывать или он закроется автоматически?

Вот пример

Код:
If FindString(sMask, "**") And CreateRegularExpression(0, "\*+") ; проверка дублирования множества
	sMask = ReplaceRegularExpression(0, sMask, "*")
EndIf
If CreateRegularExpression(0, "[\s|.]+\|") And MatchRegularExpression(0, sMask + "|") ; запрет пробела и разделителя слева от разделителя
	sMask = ReplaceRegularExpression(0, sMask + "|", "|")
EndIf

Я не закрывая использую 0 второй раз. Понятно что вставить строку не трудно, но бывает так, что для закрытия требуется усложнять код.

Понятно что совместно нельзя использовать, но задача переписать на тот же дескриптор новые данные не заботясь о старом, так как он уже не нужен.

Сейчас подумал, что тот же вариант для файла использует скорее всего WinAPI и если сам автор не прописал проверку открытого дескриптора, чтобы его закрыть, то скорее всего он останется висеть неучтённым в PureBasic.

Отредактировано AZJIO (18.02.2021 20:21:56)

0

2

AZJIO написал(а):

Есть функция FreeRegularExpression(), но во многих примерах она не используется, так как в справке написано, что при закрытии все открытые  освобождаются автоматически.

Это при завершении приложения, а до тех пор незакрытые регулярные выражения зря используют память. Поэтому когда выражение не нужно, нужно освободить используемые ресурсы вызвав FreeRegularExpression().

AZJIO написал(а):

будем называть дескриптор, допустим 0, предыдущий надо закрывать или он закроется автоматически?

Закрывается автоматически при вызове CreateRegularExpression с существующим идентификатором т. е. в этом коде нет утечки памяти.

Код:
For i=0 To 1000000
  sMask.s="**"
  If FindString(sMask, "**") And CreateRegularExpression(0, "\*+") ; проверка дублирования множества
    sMask = ReplaceRegularExpression(0, sMask, "*")
  EndIf
  If CreateRegularExpression(0, "[\s|.]+\|") And MatchRegularExpression(0, sMask + "|") ; запрет пробела и разделителя слева от разделителя
    sMask = ReplaceRegularExpression(0, sMask + "|", "|")
  EndIf
Next
CallDebugger

А в этом она наблюдается

Код:
For i=0 To 1000000
  sMask.s="**"
  id = CreateRegularExpression(#PB_Any, "\*+") ; проверка дублирования множества
  If id
    sMask = ReplaceRegularExpression(id, sMask, "*")
  EndIf
  id = CreateRegularExpression(#PB_Any, "[\s|.]+\|")
  If id And MatchRegularExpression(id, sMask + "|") ; запрет пробела и разделителя слева от разделителя
    sMask = ReplaceRegularExpression(id, sMask + "|", "|")
  EndIf
Next
CallDebugger

и вызывать FreeRegularExpression() нужно обязательно

Код:
For i=0 To 1000000
  sMask.s="**"
  id = CreateRegularExpression(#PB_Any, "\*+") ; проверка дублирования множества
  If id
    sMask = ReplaceRegularExpression(id, sMask, "*")
    FreeRegularExpression(id)
  EndIf
  id = CreateRegularExpression(#PB_Any, "[\s|.]+\|")
  If id 
    If MatchRegularExpression(id, sMask + "|") ; запрет пробела и разделителя слева от разделителя
      sMask = ReplaceRegularExpression(id, sMask + "|", "|")
    EndIf
    FreeRegularExpression(id)
  EndIf
Next
CallDebugger

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Закрывать ли рег.выр.?