CRTP复制方法警告潜在的内存泄漏

Dav*_*ave 6 c++ crtp clang-static-analyzer c++14

我有一个对象层次结构,需要能够从基类克隆对象.我遵循了典型的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;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,那里没有可能的内存泄漏,但是通过XCode运行Clang显示了这一点:

Clang潜在的内存泄漏

是否有内存泄漏吗?如果不是,导致误报的原因是什么?我该如何解决?(我宁愿不关闭静态分析)

Dav*_*ave 1

我找到了一种解决方法,可以使分析器满意,同时仍然允许使用此模式。copy只需反转和之间的链接internal_copy

template <typename T>
class CRTP : public Base {
protected:
    virtual CRTP<T> *internal_copy(void) const {
        return copy();
    }

public:
    T *copy(void) const {
        return new T(static_cast<const T&>(*this));
    }
};
Run Code Online (Sandbox Code Playgroud)

这在原始建议的上下文中仍然有效因为在 CRTP 内部解析时copy,它会更喜欢 CRTP 的覆盖(即使它不是虚拟方法),因此不存在无限循环。

至于为什么分析器对这个顺序满意但对原始顺序不满意,我不知道。