Aracılığıyla paylaş


Uyarı C26414

"Yerel akıllı işaretçiyi taşıma, kopyalama, yeniden atama veya sıfırlama."

C++ Temel Yönergeleri:
R.5: Kapsamlı nesneleri tercih edin, gereksiz yere yığın ayırmayın

Akıllı işaretçiler dinamik kaynak yönetimi için kullanışlıdır, ancak her zaman gerekli değildir. Örneğin, standart bir kapsayıcı kullanarak yerel dinamik arabelleği yönetmek daha kolay ve daha verimli olabilir. Tek nesneler için dinamik ayırmaya hiç gerek duymayabilirsiniz. Örneğin, oluşturucu işlevi hiç uzun süre yaşamazlarsa. Bunlar yerel değişkenlerle değiştirilebilir. Bir senaryo sahiplik değişikliği gerektirdiğinde akıllı işaretçiler kullanışlı hale gelir. Örneğin, bir dinamik kaynağı birden çok kez veya birden çok yolda yeniden atadığınızda. Ayrıca dış koddan elde edilen kaynaklar için de kullanışlıdır. Ayrıca, bir kaynağın ömrünü uzatmak için akıllı işaretçiler kullanıldığında.

Açıklamalar

Bu denetim hem standart std::unique_pointer hem std::shared_pointer de şablonları ve akıllı işaretçiler 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;

  • silinmemiş veya varsayılan olarak ayarlanmamış bir genel yıkıcı. Buna açıkça boş olarak tanımlanan yıkıcılar dahildir.

Türü Microsoft::WRL::ComPtr paylaşılan bir işaretçi olarak davranır, ancak genellikle COM yaşam süresi yönetiminden etkilenen belirli senaryolarda kullanılır. Aşırı gürültüyü önlemek için bu tür filtrelenir.

Bu denetim, kapsamlı değişkenlerin alternatif olarak çalışıp çalışmayabileceğini belirlemek için akıllı işaretçilere atanan açık yerel ayırmaları arar. hem işlecine newyapılan doğrudan çağrılar hem de ve std::make_sharedgibi std::make_unique özel işlevler doğrudan ayırma olarak yorumlanır.

Kod analizi adı: RESET_LOCAL_SMART_PTR

Örnek

Dinamik arabellek:

void unpack_and_send(const frame &f)
{
    auto buffer = std::make_unique<char[]>(f.size()); // C26414
    f.unpack(buffer.get());
    // ...
}

Dinamik arabellek kapsayıcıyla değiştirildi:

void unpack_and_send(const frame &f)
{
    auto buffer = std::vector<char>(f.size());
    f.unpack(buffer.data());
    // ...
}