У меня есть иерархия объектов, и мне нужно иметь возможность клонировать объекты из базового класса. Я следовал типичному шаблону CRTP, за исключением того, что я также хочу иметь возможность возвращать дочерний класс, если копия вызывается непосредственно для дочернего элемента. Для этого я последовал предложению здесь: https://stackoverflow.com/a/30252692/1180785
Кажется, это работает нормально, но Clang предупреждает меня о возможной утечке памяти. Я сократил код до этого 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
. Я подозреваю, что код, который вы запускаете, может отличаться от того, который вы показываете. - person Igor Tandetnik   schedule 11.12.2016std::unique_ptr<T>
вместо необработанного указателя. - person Igor Tandetnik   schedule 11.12.2016unique_ptr
(std::unique_ptr<T> copy(void) const { return std::unique_ptr<T>(static_cast<T*>(internal_copy())); }
) выдает предупреждение. Интересно, что я обнаружил, что он исчезает, если я изменю способ связи copy и internal_copy (т.е. если вся логика находится в копии, без вызова internal_copy, все в порядке) - person Dave   schedule 11.12.2016CRTP<T>*
, а не толькоT*
? Кроме того, посколькуT
является основойCRTP<T>
, зачем копировать егоstatic_cast
? Интересно, думает ли анализатор, что вы как-то теряете информацию со всеми изменениями типа указателя. Просто дикая догадка... - person cyberbisson   schedule 12.12.2016T
не является основойCRTP<T>
;CRTP<T>
является основойT
(именно это делает его удивительно рекурсивным!) - person Dave   schedule 12.12.2016