У меня есть иерархия объектов и вы должны иметь возможность клонировать объекты из базового класса. Я следил за типичным шаблоном CRTP, за исключением того, что я также хочу иметь возможность возвращать дочерний класс, если копия вызывается непосредственно у ребенка. Для этого я следовал предложению здесь: https://stackoverflow.com/a/30252692/1180785Метод копирования CRTP предупреждает о потенциальной утечке памяти
Кажется, что все нормально, но Кланг предупреждает меня, что у меня есть потенциальная утечка памяти. Я уменьшил код до этого MCVE:
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;
}
Насколько я могу сказать, что нет никакой возможной утечки памяти, но работаешь Clang через XCode показывает это:
Есть там утечка памяти здесь? Если нет, что вызывает ложный позитив и как я могу его обойти? (Я бы предпочел не отключать статический анализ)
Программа вы показываете [не вызывает 'CRTP :: copy'] (http://rextester.com/ UBB92957). Я подозреваю, что код, который вы запускаете, может отличаться от отображаемого вами кода. –
@IgorTandetnik хорошая точка; Я пропустил это, пока я его уменьшал. Тем не менее, предупреждение, которое я опубликовал, берется непосредственно из кода, который я разместил, поэтому как-то он действительно запускает CRTP :: copy. Это заставляет меня думать, что это может быть ошибкой в анализаторе, связанном с виртуальными методами. – Dave
@IgorTandetnik Я обновил код с улучшенной демонстрацией проблемы, которая удаляет ненужный «виртуальный» экземпляр и удаляет массив. Этот метод действительно вызывает метод CRTP :: copy, а анализ clang - тот же. – Dave