Uyarı C26417
Paylaşılan işaretçi parametresi başvuruyla geçirilir ve sıfırlanmaz veya yeniden atanmaz. Bunun yerine T* veya T& kullanın.
C++ Temel Yönergeleri: R.35: bir işlevin paylaşılan işaretçiyi yeniden açabileceğini ifade etmek için shared_ptr<pencere öğesi>¶metresi alma
Paylaşılan işaretçileri başvuruya göre geçirmek, kod çağrısının akıllı işaretçi nesnesinin hedefini güncelleştirdiği ve çağıranın bu tür güncelleştirmeleri görmeyi beklediği senaryolarda yararlı olabilir. Yalnızca paylaşılan bir işaretçi geçirme maliyetlerini azaltmak için başvuru kullanmak sorgulanabilir. Kod çağrılırsa yalnızca hedef nesneye erişir ve yaşam ömrünü hiçbir zaman yönetmezse, kaynak yönetimi ayrıntılarını göstermek yerine ham bir işaretçi veya başvuru geçirmek daha güvenlidir.
Açıklamalar
Bu denetim, paylaşılan işaretçiler
std::shared_pointer
gibi davranma olasılığı olan ve kullanıcı tanımlı türleri tanır. Kullanıcı tanımlı paylaşılan işaretçiler için aşağıdaki özellikler beklenir:aşırı başvuru veya üye erişim işleçleri (genel ve silinmemiş);
kopyalama oluşturucu veya kopyalama atama işleci (genel ve silinmemiş);
silinmemiş veya varsayılan olarak ayarlanmamış bir genel yıkıcı. Boş yıkıcılar yine de kullanıcı tanımlı olarak sayılır.
Sıfırlama veya yeniden atama eylemi daha genel bir şekilde yorumlanır:
Paylaşılan bir işaretçideki sabit olmayan bir işleve yapılan herhangi bir çağrı işaretçiyi sıfırlayabilir;
sabit olmayan bir paylaşılan işaretçiye başvuru kabul eden bir işleve yapılan herhangi bir çağrı bu işaretçiyi sıfırlayabilir veya yeniden atayabilir.
Örnekler
gereksiz arabirim komplikasyonu
bool unregister(std::shared_ptr<event> &e) // C26417, also C26415 SMART_PTR_NOT_NEEDED
{
return e && events_.erase(e->id());
}
void renew(std::shared_ptr<event> &e)
{
if (unregister(e))
e = std::make_shared<event>(e->id());
// ...
}
gereksiz arabirim komplikasyonu - basitleştirilmiş
bool unregister(const event *e)
{
return e && events_.erase(e->id());
}
void renew(std::shared_ptr<event> &e)
{
if (unregister(e.get()))
e = std::make_shared<event>(e->id());
// ...
}