Интеллектуальный указатель C ++: если в классе я определяю указатель, указывающий на интеллектуальный указатель, устраняет ли это преимущества интеллектуального указателя? (Обратите внимание, я не говорил, что хочу применить этот вид использования)
Подобно:
class TestClass
{
public SmartPt* ptr1;
}
Здесь SmartPt — класс интеллектуальных указателей.
Потому что, если я не справлюсь с указателем хорошо, то с указанными умными указателями тоже не справятся.
Значит ли это, что не рекомендуется использовать указатель, указывающий на умный указатель?
Так что лучше напрямую использовать умный указатель, например:
public SmartPt object1;
[Обновление 1] Чтобы не отвлекать читателя, ранее я использовал MySmartPt, здесь я заменяю его на SmartPt.
Нет, вы не должны пытаться использовать указатель на умный указатель, как в примере, которым вы делитесь.
умные указатели в C ++ построены на принципах RAII, которые пытаются максимально избавиться от оператора *. Они также используют перегрузку копирования / присваивания, которую не понимают необработанные указатели.
Так что, если вы хотите сделать что-то вроде этого:
void * vptr;
int i = 1346;
std::shared_ptr<int> sptr = std::make_shared<int>(i);
vptr = &sptr;
Затем совместно используемый указатель удалит себя, как только выйдет из области видимости, потому что это то, что он должен делать. Умные указатели не хранят ссылки на них, а только ссылки умных указателей на их данные.
Также, если вы позвоните delete vptr;
произойдет одно из двух:
vptr
указывает на недопустимый блок памяти.