Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Inteligentny parametr wskaźnika służy tylko do uzyskiwania dostępu do zawartego wskaźnika. Zamiast tego użyj języka T* lub T&.
Podstawowe wytyczne języka C++: R.30: Użycie inteligentnych wskaźników jako parametrów tylko do jawnego wyrażania semantyki okresu istnienia
Użycie inteligentnego typu wskaźnika w celu przekazania danych do funkcji wskazuje, że funkcja docelowa musi zarządzać okresem istnienia zawartego obiektu. Jednak powiedzmy, że funkcja używa tylko inteligentnego wskaźnika w celu uzyskania dostępu do zawartego obiektu i nigdy nie wywołuje żadnego kodu, który może prowadzić do jego cofnięcia (czyli nigdy nie wpływa na jego okres istnienia). Zazwyczaj nie trzeba komplikować interfejsu za pomocą inteligentnych wskaźników. Preferowany jest zwykły wskaźnik lub odwołanie do zawartego obiektu.
Uwagi
Ta kontrola obejmuje większość scenariuszy, które również powodują C26410, C26415, C26417 i C26418. Lepiej najpierw wyczyścić SMART_PTR_NOT_NEEDED, a następnie przełączyć się na przypadki brzegowe dla udostępnionych lub unikatowych wskaźników. Aby uzyskać bardziej ukierunkowane czyszczenie, to ostrzeżenie można wyłączyć.
Oprócz standardowych szablonów std::unqiue_pointer i std::shared_pointer ta kontrola rozpoznaje typy zdefiniowane przez użytkownika, które prawdopodobnie mają być inteligentnymi wskaźnikami. Takie typy powinny definiować następujące operacje:
- Przeciążone wyłuszczenia lub operatory dostępu do składowych, które są publiczne i nie są oznaczone jako usunięte.
- Publiczny destruktor, który nie jest usuwany lub domyślnie, w tym destruktory, które są jawnie zdefiniowane puste.
Interpretacja operacji, które mogą mieć wpływ na okres istnienia zawartych obiektów, jest szeroka i obejmuje:
- Każda funkcja, która akceptuje wskaźnik lub parametr odwołania do niestałego wskaźnika inteligentnego
- Kopiowanie lub przenoszenie konstruktorów lub operatorów przypisania
- Funkcje niestałych
Przykłady
Kłopotliwe zarządzanie okresem istnienia.
bool set_initial_message(
const std::unique_ptr<message> &m) // C26415, also C26410 NO_REF_TO_CONST_UNIQUE_PTR
{
if (!m || initial_message_)
return false;
initial_message_.reset(m.get());
return true;
}
void pass_message(const message_info &info)
{
auto m = std::make_unique<message>(info);
const auto release = set_initial_message(m);
// ...
if (release)
m.release();
}
Kłopotliwe zarządzanie okresem istnienia - przerobione.
void set_initial_message(std::shared_ptr<message> m) noexcept
{
if (m && !initial_message_)
initial_message_ = std::move(m);
}
void pass_message(const message_info &info)
{
auto m = std::make_shared<message>(info);
set_initial_message(m);
// ...
}