Nesne hiyerarşisi var ve nesneleri temel sınıftan klonlayabilmem gerekiyor. Tipik bir CRTP modelini takip ettim, ayrıca çocuk bir çocuğa doğrudan kopyalama yapıldığında çocuk sınıfını iade etmek istiyorum. Bunu yapmak için şu öneriyi takip ettim: https://stackoverflow.com/a/30252692/1180785CRTP kopyalama yöntemi, potansiyel bellek sızıntısı konusunda uyarıyor
İyi çalışıyor gibi görünüyor, ancak Clang bana potansiyel bellek sızıntısı olduğumu söyledi. Bu MCVE aşağı kodunu düşürdük:
template <typename T>
class CRTP {
protected:
virtual CRTP<T> *internal_copy(void) const {
return new T(static_cast<const T&>(*this));
}
public:
T *copy(void) const {
return static_cast<T*>(internal_copy());
}
virtual ~CRTP(void) = default;
};
class Impl : public CRTP<Impl> {
};
int main(void) {
Impl a;
Impl *b = a.copy();
delete b;
}
Bildiğim kadarıyla söyleyebilirim, orada hiçbir olası bellek sızıntısı, ama XCode ile çınlama çalışan bu gösterir
:
burada bir bellek sızıntısı var mı? Değilse, yanlış pozitife neyin neden olduğu ve bu konuda nasıl çalışabilirim? (Statik analizi devre dışı bırakmamayı tercih ederim)
Eğer ([ 'cRTP :: copy' çağırmaz] göstermek programı http://rextester.com/ UBB92957) hiç. Çalıştığınız kodun gösterdiğiniz birinden farklı olabileceğinden şüpheleniyorum. –
@IgorTandetnik iyi bir nokta; Onu indirirken onu özledim. Ancak, gönderdiğim uyarı doğrudan gönderdiğim koddan alınır, dolayısıyla bir şekilde gerçekten de CRTP :: copy. Bu, bunun aslında sanal yöntemlerle ilgili analizörde bir hata olabileceğini düşünmemi sağlıyor. – Dave
@IgorTandetnik Koddaki gereksiz "sanal" yı kaldıran ve diziyi kaldıran, sorunun geliştirilmiş bir gösterimi ile kodu güncelledim. Bu gerçekten de CRTP :: copy yöntemini çağırır ve clang analizi aynıdır. – Dave