C++ 当这些动态分配的对象的容器被破坏时,如何删除它们?

C++ 当这些动态分配的对象的容器被破坏时,如何删除它们?,c++,qt,pointers,dynamic,C++,Qt,Pointers,Dynamic,我有一个指向QStandardItems的QList指针,我将其附加到用于QTableView的QStandardItemModel中。我希望在销毁fileListView时删除QStandarItems和MODDataFile。实现这一目标的最佳方式是什么 foreach (QString fileName, fileList) { MODDataFile *file = new MODDataFile(dir.filePath(fileName)); QList<QS

我有一个指向QStandardItems的QList指针,我将其附加到用于QTableView的QStandardItemModel中。我希望在销毁fileListView时删除QStandarItems和MODDataFile。实现这一目标的最佳方式是什么

foreach (QString fileName, fileList)
{
    MODDataFile *file = new MODDataFile(dir.filePath(fileName)); 
    QList<QStandardItem*> row;

    QStandardItem *item = new QStandardItem();
    item->setData(QVariant::fromValue(file));
    row.append(item);

    row.append(new QStandardItem(file->mUserInfo["TestID"])); 
    row.append(new QStandardItem(fileName));
    row.append(new QStandardItem(file->mTimeAndLocation["Date"]));

    mFileModel.appendRow(row);
}

ui->fileListView->setModel(&mFileModel);
foreach(QString文件名、文件列表)
{
MODDataFile*file=新的MODDataFile(dir.filePath(fileName));
QList行;
QStandardItem*项=新的QStandardItem();
item->setData(QVariant::fromValue(文件));
行。追加(项目);
append(新的QStandardItem(文件->mUserInfo[“TestID”]);
append(新的QStandardItem(文件名));
追加(新的QStandarItem(文件->mTimeAndLocation[“日期]));
mFileModel.appendRow(行);
}
ui->fileListView->setModel(&mFileModel);

我尝试只使用QStandardItem对象而不是指针,但是QStandardItemModel::appendRow()采用
QList
。文件是指针,因为它们是大型类,我想将它们传递给其他类。

您可以替换以下代码行:

MODDataFile*file=newmoddatafile(dir.filePath(fileName));
QList行;
QStandardItem*项=新的QStandardItem();
item->setData(QVariant::fromValue(文件));
行。追加(项目);
append(新的QStandardItem(文件->mUserInfo[“TestID”]);
append(新的QStandardItem(文件名));
追加(新的QStandarItem(文件->mTimeAndLocation[“日期]));
mFileModel.appendRow(行);
与:

std::shared_ptr file=std::make_shared();
QList行;
std::shared_ptr item=std::make_shared();
item->setData(QVariant::fromValue(文件));
行。追加(项目);
append(std::shared_ptr(新的QStandardItem(文件->mUserInfo[“TestID”]));
append(std::shared_ptr(新的QStandardItem(文件名));
append(std::shared_ptr(新的QStandardItem(文件->mTimeAndLocation[“数据])));
mFileModel.appendRow(行);

使用
shared_ptr
unique_ptr
将在您调用它们或它们超出范围时清理内存。当它们超出范围时,它们的析构函数将为您清理所有内存和引用计数。这还取决于
mFileModel
是什么,以及您如何设计模型。

你在这些中使用了
std::unique\u ptr
?你说的“我想把它们传递给其他类”是什么意思?听起来你需要
std::shared\u ptr
。Qt实际上会自动(通常)清理子qobject,所以您不必担心QStandardItem,但是对于MODDataFile,您必须迭代行并删除它们需要一个副本。但是shared_ptr会,或者因为您已经在使用Qt,所以您可以使用QSharedPointer。@TonyJ所以如果我将MODDataFile封装在QSharedPointer中,它们将被自动删除,而不需要遍历列表,对吗?什么是mFileModel?如果它是一个qstandardintemmodel,您不必担心,因为它拥有所有权否则,它取决于您如何构建模型。数据通常应该属于模型,而不是gui元素。并且@TonyJ,QStandardItem不从QObject继承。
MODDataFile *file = new MODDataFile(dir.filePath(fileName)); 
QList<QStandardItem*> row;

QStandardItem *item = new QStandardItem();
item->setData(QVariant::fromValue(file));
row.append( item );

row.append(new QStandardItem(file->mUserInfo["TestID"])); 
row.append(new QStandardItem(fileName));
row.append(new QStandardItem(file->mTimeAndLocation["Date"]));

mFileModel.appendRow(row);
std::shared_ptr<MODDataFile> file = std::make_shared<MODDataFile>();
QList<std::shared_ptr<QStarndardItem>> row;

std::shared_ptr<QStandardItem> item = std::make_shared<QStandardItem>();
item->setData(QVariant::fromValue(file));
row.append( item );

row.append( std::shared_ptr<QStandardItem>( new QStandardItem( file->mUserInfo["TestID"])));
row.append( std::shared_ptr<QStandardItem>( new QStandardItem(filename));
row.append( std::shared_ptr<QStandardItem>( new QStandardItem(file->mTimeAndLocation["Data"])));

mFileModel.appendRow(row);