Показалки в гр Защо, кога и как да се използват различни от позоваването на обекта директно
Но, ако се получи тласък на скоростта, с което призовават директно към паметта?
Всъщност, изобщо не. Работа с указатели рамкирани в купчина, докато работите с обекти - това комин, бърза и проста структура. Ако сте начинаещ, ние имаме неща за вас, в който ще кажем подробно какво стека и куп.
Строго погледнато, този въпрос е комбинация от две различни въпроси. Първият е, когато да се използва за динамично разпределение на паметта? Второ: кога да се използват указатели? Разбира се, тук не можем да направим без общи думи, които са винаги е необходимо да се избере най-подходящият инструмент за работа. Почти винаги има реализирането на по-добре, отколкото с помощта на ръчно динамично разпределение (динамично разпределение) и / или суровини указатели.
динамично разпределение
два начина за създаване на обект представени при формулирането на въпроса. И основната разлика се крие в продължителността на живота им (продължителност на съхранение) в паметта на програмата. Използването MyObject Object. разчитате на автоматичното разпознаване на живот, както и обектът ще бъде унищожен веднага след освобождаването на неговия обхват. Но обекта * MyObject = нов обект; Това спестява на живота на проекта до момента, докато ръчно не го изтриете от паметта изтриете команда. Използвайте последната опция, само когато е наистина необходимо. Така че винаги се откажете за автоматично определяне на периода на съхранение, ако е възможно.
Обикновено за създаване задължителен срок на живот се използва в следните случаи:
- Трябва да се противопостави съществува и след напускане на зоната на видимостта му - това е обект, той е в тази област от паметта, а не копие. Ако за вас това няма значение (в повечето случаи това е), да разчита на автоматичното определяне на продължителността на живота. Но ето един пример за ситуация, в която може да се наложи да се направи обект от неговия обхват, но това може да се направи без да го запаметявате изрично: писането на обекта във вектор, можете да "прекъсне връзката" със самия обект - в действителност, той (както не копие от него) ще бъде на разположение, когато бъде призован от вектора.
- Трябва да използвате много памет. който може да прелее стека. Голям ако такъв проблем не трябва да се изправят (и лицето й е много рядко), защото тя е "извън компетентността» C ++, но за съжаление, понякога е необходимо да се реши този проблем.
- Например, не знам точно размера на масива, който ще трябва да се използва. Както е известно, в C ++ масиви в определянето на определен размер. Това може да доведе до проблеми, например, при четене на данни от потребителя. Стрелката е също така уточнява, че само част от паметта, който ще бъде записано, започващ на масива, грубо казано, не е ограничаване на неговия размер.
Ако е необходимо използването на динамично разпределение, трябва да го оформят с умен показалеца (който е по-умен показалеца може да се прочете в нашата статия), или друг вид подкрепа идиом "придобиване на ресурсите е инициализация" (стандартни контейнери го подкрепят - това е идиом, в съответствие с където ресурс: запаметяващо устройство, файл, мрежова връзка и други подобни - при получаване инициализира в конструктора и деструктора след това внимателно унищожени). Смарт те са, например, STD :: unique_ptr указатели и станд :: shared_ptr.
Въпреки това, има случаи, в които използването на показатели е оправдано не само от гледна точка на динамично разпределение на паметта, но почти винаги имат по алтернативен начин, без използване на указатели, че и вие трябва да изберете. Както и в миналото, да речем, винаги изберат алтернативен ако няма особена необходимост да се използват указатели.
Случаи, в които използването на указатели могат да се разглеждат като опция, включват следното: