我有一个对象层次结构,需要能够从基类中克隆对象。我遵循了典型的CRTP模式,除了我也希望能够在子节点直接调用副本时返回子类。为此,我按照这里的建议:https://stackoverflow.com/a/30252692/1180785CRTP复制方法警告潜在的内存泄漏
它似乎工作正常,但叮war警告我,我有潜在的内存泄漏。我已经减少了代码到这个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;
}
据我所知,有没有可能存在内存泄漏存在,但通过的XCode运行铛表明这一点:
是否存在内存泄漏?如果不是,导致误报的原因是什么,我该如何解决? (我宁愿不关闭静态分析)
您展示[不叫'CRTP :: copy'](程序http://rextester.com/ UBB92957)。我怀疑你运行的代码可能与你展示的代码不同。 –
@IgorTandetnik好点;我在减少它的时候错过了。但是,我发布的警告是直接从我发布的代码中获取的,所以它确实运行了CRTP :: copy。这让我觉得这实际上可能是与虚拟方法有关的分析器中的一个错误。 – Dave
@IgorTandetnik我更新了代码,并对问题进行了改进演示,它删除了副本上不必要的“虚拟”并删除了阵列。这个确实调用了CRTP :: copy方法,并且铿锵分析是一样的。 – Dave