gpt4 book ai didi

c++ - 使用 Qt 内存管理时对 clang 静态分析的误报

转载 作者:行者123 更新时间:2023-12-05 06:10:37 24 4
gpt4 key购买 nike

考虑以下代码:

#include <iostream>
#include <QObject>

class ParentClass : public QObject
{
public:
explicit ParentClass(QObject *parent = nullptr) : QObject(parent) {
std::cout << "ParentClass" << std::endl;
}
~ParentClass() override {
std::cout << "~ParentClass" << std::endl;
}
};

class ChildClass : public QObject
{
public:
explicit ChildClass(QObject *parent = nullptr) : QObject(parent) {
std::cout << "ChildClass" << std::endl;
}
~ChildClass() override {
std::cout << "~ChildClass" << std::endl;
}
void hi() { std::cout << "hi" << std::endl; }
};

int main()
{
auto *parent = new ParentClass();
auto *child = new ChildClass(parent);
child->hi();
delete parent;

return 0;
}

当我运行 clang 静态分析 (scan-build) 时,它报告潜在的内存泄漏:

main.cxx:34:3: warning: Potential leak of memory pointed to by 'child'
delete parent;
^~~~~~~~~~~~~
1 warning generated.

问题是我在这里使用 Qt 的内存管理,其中树结构上的父对象管理子对象。它工作得很好,从输出中可以看出:

ParentClass
ChildClass
hi
~ParentClass
~ChildClass

我可以看出这并不明显,但另一方面我有很多代码使用 Qt 基础架构,因此报告中充满了误报。

FAQ ( https://clang-analyzer.llvm.org/faq.html ) 没有讨论内存泄漏。

有没有办法抑制这些误报,使它们不被报告?

我所能想到的就是创建一些伪装的调用 delete 的代码,但这需要更改大量代码。此外,它感觉像是一个 hack:

  auto *parent = new ParentClass();
auto *child = new ChildClass(parent);
child->hi();
#ifdef __clang_analyzer__
delete child;
#endif
delete parent;

有没有更好的办法?

最佳答案

这是我解决这些警告的方法:

在 my_utils.h 中:

// For avoiding memory leak warnings
#define IGNORE_MEMORY_LEAK_WARNING(x) no_memory_leak_ptr = x
extern void *no_memory_leak_ptr;

在 my_utils.cpp 中:

// For avoiding memory leak warnings
void *no_memory_leak_ptr;

然后,在带有警告的代码中,我可以做类似的事情:

HelpWindow *win = new HelpWindow(this, HelpWindow::HelpAbout);
IGNORE_MEMORY_LEAK_WARNING(win);

对我来说,这非常整洁。如果出现更好的解决方案,使用#defines 允许我稍后更改方法。

关于c++ - 使用 Qt 内存管理时对 clang 静态分析的误报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64393240/

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