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 new
yapılan doğrudan çağrılar hem de ve std::make_shared
gibi 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());
// ...
}
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin