使用std::shared_ptr将QListWidgetItem添加到QListWidget中以修复强化问题



Fortify不喜欢QListWidget::addItem(new QListWidgetItem),并报告错误的内存泄漏,即使QT可以正确管理内存。

我正在想办法解决问题。我被告知要使用std::shared_ptr,但我还没有弄清楚语法。以下是到目前为止我得到的内容,但它报告了一个关于类型的错误。

这两行代码是我需要修复的全部内容,没有进一步的上下文。只需查找指向QListWidgetItem的共享指针的语法,就可以使用addItem()将该项添加到列表小部件中。

任何有效的语法都可以。必须创建一个QListWidgetItem,然后添加它。不能使用additem("string"(语法。

在头文件中,声明成员变量项:

...
class Class1{
...
std::shared_ptr<QListWidgetItem> item;
...
};

在源文件中:

...
Class1::ClassFunction1()
{
std::make_shared<QListWidgetItem> item("AStringToAdd");
ui->qlw->addItem(item);
}

根据我的评论,您可能可以使用std::unique_ptr来静音强化。。。

Class1::ClassFunction1 ()
{
auto item = std::make_unique<QListWidgetItem>("AStringToAdd");
/*
* Use std::unique_ptr::release() to transfer ownership of the
* QListWidgetItem to the QListWidget.
*/
ui->qlw->addItem(item.release());
}

@hyde在回答中提供的解决方案当然更稳健。话虽如此,最初的帖子本质上是在寻求用强化工具解决问题的方法。因此,真正的解决方案是";固定工具";或者找到其他更好的分析工具。

根据您在问题中显示的代码,这可能会奏效:

class Class1{
...
std::unique_ptr<QListWidgetItem> item; // no need to use shared ptr
std::unique_ptr<...whatever you need here...> ui; // change ui to unique_ptr and put it after the item!
// remember to change construction of `ui` accordingly, and remove deleting it in destructor
...
};
Class1::ClassFunction1()
{
// reset member variable, don't create a new local variable
item.reset(new QListWidgetItem>("AStringToAdd"));
ui->qlw->addItem(item.get()); // pass naked pointer
}

这样,item将在ui之前超出范围,并将被unique_ptr删除。当项目被删除时,它将通知视图,视图将删除该项目。

如果以另一种方式执行,视图将删除该项目,但它无法通知unique_ptr。因此unique_ptr会再次删除它,导致Undefined Behavior,幸运的是只是崩溃。

最新更新