Передача общих указателей в качестве аргументов


Если я объявляю объект, завернутый в общий указатель:

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 69

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, когда это возможно-я бы сказал Да даже при работе с умными указателями. Ваш второй пример не совсем сломан, но это очень !???. Глупо, не выполняя ничего и побеждает часть точки умных указателей, и собирается оставить вас в багги мире боли, когда вы пытаетесь разыменовать и изменить вещи.