Ich habe eine Objekthierarchie und muss in der Lage sein, Objekte aus der Basisklasse zu klonen. Ich habe das typische CRTP-Muster verfolgt, außer dass ich auch die Kindklasse zurückgeben möchte, wenn die Kopie direkt für ein Kind aufgerufen wird. Um das zu tun, habe ich den Vorschlag hier: https://stackoverflow.com/a/30252692/1180785CRTP-Kopiermethode warnt vor möglichem Speicherleck
Es scheint gut zu funktionieren, aber Clang warnt mich, dass ich ein potenzielles Speicherleck haben.
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;
}
Soweit ich das beurteilen kann, gibt es kein mögliche Speicherleck gibt, aber Clang durch XCode läuft zeigt dies: Ich habe den Code unten auf diese MCVE reduziert
Ist dort ein Speicherleck hier? Wenn nicht, was verursacht das falsche Positive und wie kann ich es umgehen? (Ich würde die statische Analyse lieber nicht abschalten)
Das Programm, das Sie zeigen [ruft nicht 'CRTP :: copy'] (http://rextester.com/ UBB92957) überhaupt. Ich vermute, dass der Code, den Sie ausführen, von dem, den Sie anzeigen, abweichen kann. –
@IgorTandetnik guter Punkt; Das habe ich vermisst, während ich es reduziert habe. Die Warnung, die ich gepostet habe, stammt jedoch direkt aus dem Code, den ich gepostet habe, also führt sie tatsächlich CRTP :: copy aus. Das lässt mich glauben, dass dies ein Fehler im Analysator sein könnte, der mit virtuellen Methoden zusammenhängt. – Dave
@IgorTandetnik Ich habe den Code mit einer verbesserten Demonstration des Problems aktualisiert, die die unnötige "virtuelle" auf der Kopie entfernt und das Array entfernt. Dieser Aufruf ruft tatsächlich die CRTP :: copy-Methode auf, und die Clang-Analyse ist dieselbe. – Dave