Передача общих указателей в качестве аргументов
Если я объявляю объект, завернутый в общий указатель:
std::shared_ptr<myClass> myClassObject(new myClass());
затем я хотел передать его в качестве аргумента метода:
DoSomething(myClassObject);
//the called method
void DoSomething(std::shared_ptr<myClass> arg1)
{
arg1->someField = 4;
}
это просто увеличивает количество ссылок shared_pt, и все круто? Или он оставляет болтающийся указатель?
вы все еще должны это делать?:
DoSomething(myClassObject.Get());
void DoSomething(std::shared_ptr<myClass>* arg1)
{
(*arg1)->someField = 4;
}
Я думаю, что 2-й способ может быть более эффективным, потому что он только должен скопировать 1 адрес (в отличие от всего смарт указатель), но 1-й способ кажется более читаемым, и я не ожидаю, что он будет ограничивать производительность. Я просто хочу убедиться, что в этом нет ничего опасного.
спасибо.
4 ответа:
Я хочу передать общий указатель на функцию. Вы можете мне помочь с этим?
конечно, я могу помочь с этим. Я предполагаю, что у вас есть некоторое понимание семантики владения в C++. Это правда?
Да, я достаточно комфортно с этой темой.
хорошо.
хорошо, я могу думать только о двух причинах, чтобы взять
Я думаю, что люди излишне боятся использовать необработанные указатели в качестве параметров функции. Если функция не собирается хранить указатель или иным образом влиять на его время жизни, необработанный указатель работает так же хорошо и представляет собой наименьший общий знаменатель. Рассмотрим, например, как бы вы передали
unique_ptr
в функцию, которая принимаетshared_ptr
в качестве параметра по значению или по константной ссылке?void DoSomething(myClass * p); DoSomething(myClass_shared_ptr.get()); DoSomething(myClass_unique_ptr.get());
необработанный указатель в качестве параметра функции не мешает вам использование интеллектуальных указателей в вызывающем коде, где это действительно важно.
да, вся идея о shared_ptr заключается в том, что несколько экземпляров могут содержать один и тот же необработанный указатель, и базовая память будет освобождена только тогда, когда будет уничтожен последний экземпляр shared_ptr.
Я бы избегал указателя на shared_ptr, поскольку это побеждает цель, поскольку вы теперь снова имеете дело с raw_pointers.
передача по значению в вашем первом примере безопасна, но есть лучшая идиома. Проходите по ссылке const, когда это возможно-я бы сказал Да даже при работе с умными указателями. Ваш второй пример не совсем сломан, но это очень
!???
. Глупо, не выполняя ничего и побеждает часть точки умных указателей, и собирается оставить вас в багги мире боли, когда вы пытаетесь разыменовать и изменить вещи.