Я понимаю, что в C ++ лучше / безопаснее использовать умные указатели, чтобы убедиться, что мы никогда не пропустим освобождение / удаление выделенной памяти. Недавно я наткнулся на следующее в лекции о интеллектуальных указателях на C ++. Вот пример:
void test_pointer(void)
{
typedef std::shared_ptr<MyObject> MyObjectPtr;
MyObjectPtr p1; // Empty
{
MyObjectPtr p2(new MyObject());
p1 = p2;
}
}
Теперь я понимаю, что std:shared_ptr
будет уничтожено после последней ссылки на него, ie после выхода из функции p1
будет уничтожено. Но предупреждение в конце было о висячей ссылке, что меня смутило:
MyObjectPtr* pp = new MyObjectPtr(new MyObject());
В примечании упоминается, что если это было объявлено внутри функции, то это висячая ссылка, которая предотвращает std::shared_ptr
от того, чтобы быть удаленным. Это почему? Мы используем умные указатели, поэтому мы никогда не должны оказаться в такой ситуации?