Warnung C26418
Der Freigegebene Zeigerparameter wird nicht kopiert oder verschoben. Verwenden Sie stattdessen T* oder T&
C++-Kernrichtlinien: R.36: Nehmen Sie einen shared_ptr Widget>&-<Parameter, um auszudrücken, dass sie möglicherweise eine Verweisanzahl auf das Objekt beibehalten.
Wenn ein gemeinsam genutzter Zeigerparameter nach Wert oder verweis auf ein Konstantenobjekt übergeben wird, wird erwartet, dass die Funktion die Kontrolle über die Lebensdauer des Zielobjekts übernimmt, ohne dass sich dies auf den Aufrufer auswirkt. Der Code sollte entweder den freigegebenen Zeigerparameter in ein anderes freigegebenes Zeigerobjekt kopieren oder verschieben oder ihn an anderen Code übergeben, indem Sie Funktionen aufrufen, die freigegebene Zeiger akzeptieren. Andernfalls kann ein einfacher Zeiger oder Verweis machbar sein.
Hinweise
Diese Überprüfung erkennt
std::shared_pointer
und benutzerdefinierte Typen, die sich wahrscheinlich wie freigegebene Zeiger verhalten. Für benutzerdefinierte freigegebene Zeiger werden die folgenden Merkmale erwartet:überladene Ableitungen oder Memberzugriffsoperatoren (öffentlich und nicht gelöscht);
einen Kopierkonstruktor oder einen Zuweisungsoperator (öffentlich und nicht gelöscht);
ein öffentlicher Destruktor, der nicht gelöscht oder standardmäßig festgelegt ist. Leere Destruktoren werden weiterhin als benutzerdefinierte Gezählt.
Beispiele
unnötige Schnittstellenkomplikation
template<class T>
std::string to_string(const std::shared_ptr<T> &e) // C26418, also C26415 SMART_PTR_NOT_NEEDED
{
return !e ? null_string : e->to_string();
}
unnötige Schnittstellenkomplikation - vereinfacht
template<class T>
std::string to_string(const T *e)
{
return !e ? null_string : e->to_string();
}