0

要素をに挿入すると、との両方にQTreeWidgetメモリが割り当てられます。QStringListQTreeWidgetItem

QStringList *temp;
while(other_elements)
{
    temp = new QStringList();
    temp->push_back("first_field");
    temp->push_back("second_field");

    items.append(new QTreeWidgetItem((QTreeWidget*)0, *temp));

    element_iterator++;
}

myTreeWidget->insertTopLevelItems(0, items);

関数が呼び出されるとQTreeWidgetItem自動的に割り当てが解除されることを読みましたが、どうでしょうか。メモリリークですか?clear()QStringList

4

1 に答える 1

4

あなたのコードはリークしますが、あなたが考える理由ではありません。

維持するQStringListものQTreeWidgetItemはツリーアイテムとともに削除されます-それはうまくいくでしょう。

しかしtempあなたが割り当てられているのはそうではありません。*tempこれをコンストラクターに渡すと、アイテムはそのコピーを格納します。割り当てたオブジェクトはまだ存続しており、コンストラクターの呼び出し後も十分です。削除していないため、リークされます。

リークと不要なヒープ割り当てを回避するために、コードを次のように変更します。

while(other_elements)
{
    QStringList temp;
    temp.push_back("first_field");
    temp.push_back("second_field");

    items.append(new QTreeWidgetItem((QTreeWidget*)0, temp));

    element_iterator++;
}
于 2013-01-27T18:47:05.413 に答える