Я никогда не использовал какой-либо умный указатель, но я продолжаю читать о них почти везде, когда тема является указателем. Я понимаю, что есть ситуации, когда интеллектуальные указатели работают гораздо лучше, чем исходные указатели, потому что в какой-то степени они управляют владением указателем. Тем не менее, я до сих пор не знаю, где находится строка «Я не нуждаюсь в умных указателях для этого» и «это случай для интеллектуальных указателей».Почему я должен использовать интеллектуальную указатель в этой ситуации?
Позволяет сказать, у меня есть следующая ситуация:
class A {
public:
double get1(){return 1;}
double get2(){return 2;}
};
class SomeUtilityClass {
public:
SomeUtilityClass(A* a) : a(a) {}
double getResult(){return a->get1() + a->get2();}
void setA(A* a){a = a;}
private:
A* a;
};
int main(int argc, char** argv) {
A a;
SomeUtilityClass u(&a);
std::cout << u.getResult() << std::endl;
A a2;
u.setA(&a2);
std::cout << u.getResult() << std::endl;
return 0;
}
Это, конечно, является упрощенным примером. Я имею в виду, что SomeUtilityClass
не должен «владеть» экземпляром A
(потому что это всего лишь класс утилиты), поэтому он просто удерживает указатель.
Что касается указателя, единственное, что я знаю, что может пойти не так, это:
SomeUtilityClass
может быть реализован с нулевым указателем- Объект указал на может быть удален/выйти из сфера, без
SomeUtilityClass
заметил, что
Как мог умный указатель поможет избежать этой проблемы? Какие еще преимущества я получу, используя интеллектуальный указатель в этом случае?
PS: Я знаю, что есть несколько вопросов по умным указателям (например, this one). Однако, я был бы признателен, если бы вы могли рассказать мне о влиянии на этот конкретный пример.
Исходные указатели прекрасно фиксируют концепцию несоблюдения ссылок на данные с ограниченным сроком службы. Здесь вы не должны использовать интеллектуальные указатели. – Mankarse
Если вы используете 'new' в дикой природе, это довольно сильный намек, вам может понадобиться умный указатель. Если вы используете 'new []', это довольно сильный намек, вам может понадобиться 'std :: vector' или другой контейнер. – JBL
Если 'nullptr' не имеет смысла, вы можете вместо этого использовать ссылку или' std :: reference_wrapper'. –