Aracılığıyla paylaş


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());
    // ...
}