Просто добавьте еще одно условие:
if (search != "" && (search.startsWith("th") || search.length >= minlength)) {...}
Предпочтите локальные переменные, если Вам не требуется время жизни объекта для расширения вне текущего блока. (Локальные переменные являются второй опцией). Это просто легче, чем волнение по поводу управления памятью.
P.S. При необходимости в указателе потому что Вам нужен он для передачи другой функции, просто используйте операцию вычисления адреса:
SomeFunction(&DoSomthing);
Вторая форма является так называемым RAII (Приобретение Ресурса Является Инициализацией), шаблон. Это имеет много преимуществ перед первым.
Когда использование new
, необходимо использовать delete
самостоятельно, и гарантия, это будет всегда удаляться, даже если исключение будет выдано. Необходимо гарантировать все это сами.
При использовании второй формы когда переменная выходит из объема, это всегда очищается автоматически. И если исключение выдается, стек раскручивается, и это также очищено.
Так, необходимо предпочесть RAII (вторая опция).
Существует два основных соображения, когда Вы объявляете переменную на стеке по сравнению с в "куче" - контроль времени жизни и управление ресурсами.
Выделение на стеке работает действительно хорошо, когда Вы имеете жесткий контроль за время жизни объекта. Это означает, что Вы не собираетесь передавать указатель или ссылку того объекта кодировать за пределами объема локальной функции. Это означает, нет параметры, никакие вызовы COM, никакие новые потоки. Довольно много ограничений, но Вы очистили объект правильно для Вас на нормальном или исключительном выходе от текущей области (Хотя, Вы могли бы хотеть читать на правилах раскручивания стека с виртуальными деструкторами). Самый большой недостаток выделения стека - стек обычно ограничивается 4K или 8K, таким образом, Вы могли бы хотеть быть осторожными, что Вы ставите его.
Выделение на "куче", с другой стороны, потребовало бы Вас к очистке экземпляр вручную. Это также означает, что у Вас есть большая свобода, как управлять временем жизни экземпляра. Необходимо сделать это в двух сценариях: a) Вы собираетесь передать тот объект из объема; или b) объект является слишком большим и выделяет, он на стеке мог вызвать переполнение стека.
BTW, хороший компромисс между этими двумя выделяет объект на "куче" и выделяет интеллектуальный указатель ему на стеке. Это гарантирует, что Вы не тратите впустую драгоценную стековую память, все еще получение автоматической очистки на объеме выходит.
В дополнение к тому, что было сказано до сих пор, но существуют дополнительные соображения производительности, которые будут приняты во внимание, особенно в интенсивных выделением памяти приложениях:
new
выделит память от "кучи". В случае интенсивного (чрезвычайно частого) выделения и освобождения, Вы будете платить высокой цене: Так, при необходимости в объектах для резюме (или ограниченный по объему) промежуток времени определенно используйте второй подход (локальная переменная, на стеке.), Если необходимо обменяться данными между потоками, использовать new/malloc
(с одной стороны Вы имеете к, на секундной стрелке эти объекты достаточно обычно долговечны, таким образом, Вы платите чрезвычайно с 0 стоимостью в отношении диспетчера "кучи".)
Mark Ransom прав, также необходимо будет инстанцировать с new
если Вы собираетесь передать переменную в качестве параметра функции CreateThread-esque.
Вторая версия раскрутит стек, если исключение будет выдано. Первое не будет. Я не вижу большого различия иначе.
Самое большое различие между этими двумя то, что новые посвященные указатель на объект.
Путем создания объекта без нового инициируемый объект хранится на стеке. Если это инициируется с новым, это возвращает указатель на новый объект, который был создан на "куче". Это на самом деле возвращает адрес памяти, который указывает на новый объект. Когда это происходит, Вы должны к памяти управлять переменной. Когда Вы сделаны с помощью переменной, необходимо было бы звонить, удаляют на нем для предотвращения утечки памяти. Без нового оператора, когда переменная выйдет из объема, память будет освобождена автоматически.
Таким образом, если необходимо передать переменную за пределами текущей области, использование нового более эффективно. Однако, если необходимо сделать временную переменную или что-то, что будет только использоваться временно, имение объекта на стеке будет лучше, так как Вы не должны волноваться об управлении памятью.