Когда я ни на “Что” должен установить переменную в VB6?

Общей трюкой является использование техники захвата внутри неизведанного позитивного взгляда. Используйте это регулярное выражение с preg_match_all:

(?=(1....1))

См. regex demo

Значения находятся в $matches[1] :

$re = "/(?=(1....1))/"; 
$str = "001110000100001100001"; 
preg_match_all($re, $str, $matches);
print_r($matches[1]);

См. ссылку lookahead :

Lookaround фактически соответствует символам, но затем отбрасывает совпадение, возвращая только результат: совпадение или не совпадает. Вот почему их называют «утверждениями». Они не потребляют символы в строке, а только утверждают, возможно ли совпадение.

Если вы хотите сохранить совпадение регулярного выражения внутри lookahead, вам нужно поместить скобки для скобок вокруг регулярного выражения внутри lookahead, вот так: (?=(regex)).

blockquote>

10
задан Matt Dillard 27 August 2008 в 18:05
поделиться

8 ответов

@Matt Диллард - Установка Did они ни к чему фиксируют Вашу утечку памяти?

VB6 не имеет формального сборщика "мусора", больше вроде того, что сказал @Konrad Rudolph.

На самом деле вызов разгружается на Ваших формах, кажется, мне лучший способ гарантировать, что основная форма очищена и что каждая подчиненная форма очищает их действия.

Я протестировал это с пустым проектом и двумя незаполненными бланками.

Private Sub Form_Load()
  Dim frm As Form2
  Set frm = New Form2
  frm.Show
  Set frm = Nothing
End Sub

После выполнения обеих форм оставлены видимыми. установка кадра ни к чему преуспела... ничего.

После установки кадра ни к чему единственный дескриптор, открытый для этой формы, через ссылку.

Unload Forms(1)

Я вижу проблему правильно?

  • Josh
8
ответ дан 3 December 2019 в 14:45
поделиться

На самом деле VB6 реализует RAII точно так же, как C++, означающий, что локально заявленные ссылки автоматически установлены на Nothing в конце блока. Точно так же это должно автоматически сбросить членские переменные класса после выполнения Class_Terminate. Однако было несколько отчетов, что это не сделано надежно. Я не помню строгого теста, но это всегда была лучшая практика для сброса членских переменных вручную.

8
ответ дан 3 December 2019 в 14:45
поделиться

@Martin

VB6 имел оператор "With/End With", который работал "как" оператор Using () в C#.NET. И конечно, чем менее глобальные вещи Вы имеете, тем лучше для Вас.

С/Конец С не делает работы как оператор Using, она не "Располагает" в конце оператора.

С/Конец С работами в VB 6 точно так же, как это делает в VB.Net, это - в основном путь к вызову свойств/методов объекта ярлыка. например.

С aCustomer.FirstName = "John".LastName = Конец "Smith" С

4
ответ дан 3 December 2019 в 14:45
поделиться

Объекты в VB имеют подсчет ссылок. Это означает, что объект проводит подсчет того, сколько другие переменные объекта содержат ссылку на него. Когда нет никаких ссылок на объект, объект собран "мусор" (в конечном счете). Этот процесс является частью спецификации COM.

Обычно, когда локально инстанцированный объект выходит из объема (т.е. выходит из sub), его подсчет ссылок понижается одним, другими словами, переменная, ссылающаяся на объект, уничтожается. Таким образом в большинстве экземпляров Вы не должны будете явно устанавливать объект, равный Ничему при выходе из Замены.

Во всех других экземплярах ни на Что необходимо явно установить переменную объекта для уменьшения ее подсчета ссылок (одним). Устанавливая переменную объекта ни на Что, не обязательно уничтожит объект, необходимо установить ВСЕ ссылки ни на Что. Эта проблема может стать особенно острой с рекурсивными структурами данных.

Другой глюк, при использовании Нового ключевого слова в объявлении переменной объекта. Объект только создается на первом использовании, не в точке, где Новое ключевое слово используется. Используя Новое ключевое слово в объявлении воссоздаст объект на первом использовании каждый раз, когда его подсчет ссылок переходит к нулю. Так установка объекта ни к Чему может уничтожить его, но объект будет автоматически воссоздан, если ссылается снова. Идеально Вы не должны объявлять использование Нового ключевого слова, но при помощи оператора New, который не имеет этого поведения восстановления.

4
ответ дан 3 December 2019 в 14:45
поделиться

Строго говоря никогда, но это дает сборщику "мусора" сильную подсказку для чистки вещей.

Как правило: сделайте это каждый раз, когда Вы сделаны с объектом, который Вы создали.

2
ответ дан 3 December 2019 в 14:45
поделиться

При установке ссылки VB6 ни на Что, уменьшает количество refecences, которое VB имеет для того объекта. Если и только если количество является нулем, то объект будет уничтожен.

Не думайте, что просто, потому что Вы ни на Что не устанавливаете, это будет "собрано"мусор"" как в.NET

VB6 использует ссылочный счетчик.

Вы поощряетесь ни на "Что" не установить объекты instanciated, которые делают referece к коду C/C++ и материалу как этот. Это было долгое время, так как я коснулся VB6, но я не забываю устанавливать файлы и ресурсы ни к чему.

В любом случае не причинит боль (если это уже было Ничто), но это не означает, что объект будет уничтожен.

VB6 имел оператор "With/End With", который работал "как" оператор Using () в C#.NET. И конечно, чем менее глобальные вещи Вы имеете, тем лучше для Вас.

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

2
ответ дан 3 December 2019 в 14:45
поделиться

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

Я потянул старый код, и это смотрит что-то как:

Dim y As Long
For y = 0 To Forms.Count -1
    Unload Forms(x)
Next

Может быть более безопасно Разгрузить m_frm1. и не просто ни на что устанавливает его.

2
ответ дан 3 December 2019 в 14:45
поделиться

Один важный момент, который здесь еще не упоминался, заключается в том, что установка ссылки на объект на Nothing приведет к запуску деструктора объекта (Class_Terminate, если класс был написано на VB), если нет других ссылок на объект (счетчик ссылок равен нулю).

В некоторых случаях, особенно при использовании шаблона RAII, код завершения может выполнить код, который может вызвать ошибку. Я считаю, что это относится к некоторым классам ADODB. Другим примером является класс, который инкапсулирует ввод-вывод файла - код в Class_Terminate может попытаться очистить и закрыть файл, если он все еще открыт, что может вызвать ошибку.

Поэтому важно знать, что установка ссылки на объект на Ничто не может вызвать ошибку и обрабатывать ее соответствующим образом (как именно будет зависеть от вашего приложения - например, вы можете игнорировать такие ошибки, вставив «On Error Resume Next» непосредственно перед «Set ... = Nothing»).

2
ответ дан 3 December 2019 в 14:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: