gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:42:51 26 4
gpt4 key购买 nike

我有一个对象层次结构,需要能够从基类克隆对象。我遵循了典型的 CRTP 模式,除了我还希望能够在直接对子类调用 copy 时返回子类。为此,我遵循了此处的建议: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;
}

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

Clang potential memory leak

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

最佳答案

我找到了一种变通方法,它使分析器满意,同时仍然允许使用此模式。只需反转 copyinternal_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));
}
};

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

至于为什么分析器对这个订单满意而对原来的订单不满意,我不知道。

关于c++ - CRTP 复制方法警告潜在的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41087059/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com