Aracılığıyla paylaş


Uyarı C26415

Akıllı işaretçi parametresi yalnızca kapsanan işaretçiye erişmek için kullanılır. Bunun yerine T* veya T& kullanın.

C++ Temel Yönergeleri: R.30: Akıllı işaretçileri yalnızca ömür semantiğini açıkça ifade etmek için parametre olarak alın

Bir işleve veri geçirmek için akıllı işaretçi türü kullanmak, hedef işlevin kapsanan nesnenin ömrünü yönetmesi gerektiğini gösterir. Ancak, işlevin yalnızca içerdiği nesneye erişmek için akıllı işaretçiyi kullandığını ve serbest bırakılmasına neden olabilecek herhangi bir kodu çağırmadığını (başka bir ifadeyle yaşam ömrünü hiçbir zaman etkilemediğini) varsayalım. Bu durumda genellikle arabirimi akıllı işaretçilerle karmaşık hale getirmek gerekmez. İçeren nesneye düz işaretçi veya başvuru tercih edilir.

Açıklamalar

Bu denetim C26410, C26415, C26417 ve C26418'e de neden olan senaryoların çoğunu kapsar. Önce SMART_PTR_NOT_NEEDED temizlemek ve ardından paylaşılan veya benzersiz işaretçiler için kenar durumlarına geçmek daha iyidir. Daha odaklanmış temizleme için bu uyarı devre dışı bırakılabilir.

Standart std::unqiue_pointer ve std::shared_pointer şablonlarına ek olarak, bu denetim akıllı işaretçi olması muhtemel kullanıcı tanımlı türleri tanır. Bu tür türlerin aşağıdaki işlemleri tanımlaması beklenir:

  • Genel olan ve silinmiş olarak işaretlenmemiş aşırı başvuru veya üye erişim işleçleri.
  • Açıkça boş olarak tanımlanan yıkıcılar da dahil olmak üzere silinmeyen veya varsayılan olarak ayarlanmayan genel yıkıcı.

kapsanan nesnelerin ömrünü etkileyebilecek işlemlerin yorumlanması geniş kapsamlıdır ve şunları içerir:

  • Sabit olmayan bir akıllı işaretçiye işaretçi veya başvuru parametresi kabul eden herhangi bir işlev
  • Oluşturucuları veya atama işleçlerini kopyalama veya taşıma
  • Sabit olmayan işlevler

Örnekler

Hantal ömür yönetimi.

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

Hantal ömür yönetimi - yeniden çalışıldı.

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