我正在加载一个文件,需要为文件中的每个QTTreeWidgetItem创建一行。由于我在for循环中执行此操作,我担心会发生内存泄漏。我用这个运行了Valgrind,它似乎没有内存泄漏,但我对一般使用Valgrind是新手。我担心内存泄漏。当填充DisassemblyTreeWidget时,我将调用
DisassemblyTreeWidget->clear();
当我完成程序后,我会删除该对象,但我不确定DisassemblyListItem,我认为它可能会丢失。
这是代码,我将尝试在中进行评论。欢迎在评论中提问。
如果这确实是内存泄漏,那么我应该如何编程一个循环来添加项目?
QTreeWidgetItem *DisassemblyListItem;
void SetDisassemblyWidgetContent(Ui::MainWindow *ui , std::string Address, std::string Mneumonics ,std::string Commment)
{
const bool __sortingEnabled = ui->DisassemblyTreeWidget->isSortingEnabled();
ui->DisassemblyTreeWidget->setSortingEnabled(false);
//I worry Memory Leak exists here .
DisassemblyListItem = new QTreeWidgetItem();
DisassemblyListItem->setText(2, QApplication::translate("MainWindow", Commment.c_str(), Q_NULLPTR));
DisassemblyListItem->setText(1, QApplication::translate("MainWindow", Mneumonics.c_str(), Q_NULLPTR));
DisassemblyListItem->setText(0, QApplication::translate("MainWindow", Address.c_str(), Q_NULLPTR));
ui->DisassemblyTreeWidget->addTopLevelItem(DisassemblyListItem);
ui->DisassemblyTreeWidget->setSortingEnabled(__sortingEnabled);
}
void GetDisassemblyWidgetContent(Ui::MainWindow *ui)
{
ui->DisassemblyTreeWidget->clear();
std::string Address = "";
std::string Mneumonics = "";
std::string Comment = "";
if( (BinaryType == ArchTypeELFX86 ) ||(BinaryType == ArchTypeELFX86) ){
ui->DisassemblyTreeWidget->header()->resizeSection(0 /*column index*/, 250 /*width*/);
ui->DisassemblyTreeWidget->header()->resizeSection(1 /*column index*/, 380 /*width*/);
}else{
ui->DisassemblyTreeWidget->header()->resizeSection(0 /*column index*/, 350 /*width*/);
ui->DisassemblyTreeWidget->header()->resizeSection(1 /*column index*/, 470 /*width*/);
}
std::vector<std::string> DisassemblyWidgetJSONContent;
std::string JsonReturnData = PyEngine_ExecuteCommandWithoutParams("pygdbmi-debugger", "GetTextSection");
//qInfo() << JsonReturnData.c_str();
DisassemblyWidgetJSONContent = SplitJsonIntoStringsEx(JsonReturnData);
for (int i = 0 ; i < DisassemblyWidgetJSONContent.size(); i++)
{
auto JsonData = json::parse(DisassemblyWidgetJSONContent[i].c_str() );
JsonData.at("Address").get_to(Address);
JsonData.at("Mneumonics").get_to(Mneumonics);
JsonData.at("Comment").get_to(Comment);
SetDisassemblyWidgetContent(ui, Address, Mneumonics, Comment);
}
//Not sure if this is needed, I will check potom
DisassemblyWidgetJSONContent.clear(); // Clear Vector
std::vector<std::string>().swap(DisassemblyWidgetJSONContent);
}
我相信这里没有内存泄漏,因为QTreeWidget
拥有添加项的所有权。Qt文档明确说明了setItemWidget
函数。虽然在addTopLevelItem
函数的描述中没有直接解决所有权问题,但很可能它的工作原理是一样的。
无论如何,只要在QTreeWidgetItem
:的构造函数中提供一个父级即可
DisassemblyListItem = new QTreeWidgetItem(ui->DisassemblyTreeWidget);
父级拥有所有子级的所有权,并在销毁时自动删除它们。