douhaha11 发表于 2022-9-16 10:39:48

QMimeData问题:new了一个QMimeData,是否需要释放

使用 QMimeData 复制文件到剪贴板,先new了一个QMimeData 对象,将对象数据放到剪贴板后,如果在最后释放掉 data,就会导致剪贴板里没有数据,请问一下QMimeData申请内存不释放会内存泄漏吗?
代码如下:
    QList<QUrl> copyfile;
    QUrl url=QUrl::fromLocalFile("G:\\test.txt");    //待复制的文件
    if(url.isValid()){
      copyfile.push_back(url);
    }else{
      return;
    }
    QMimeData *data=new QMimeData;
    data->setUrls(copyfile);

    QClipboard *clip=QApplication::clipboard();
    clip->setMimeData(data);

    //delete data;


十里八乡俊后生 发表于 2022-9-16 10:52:48

插个眼,我刚学qt也不太懂这个,等后面回头在看看这个

crazylq 发表于 2022-9-22 22:19:03

不需要用户手动释放,Qt 会自己管理对象的声明周期

cclon 发表于 2022-10-9 14:26:18

这个看你代码是怎么写的,QT是有对象树机制,但是看你的代码:
QMimeData *data=new QMimeData;
data->setUrls(copyfile);

这里创建的data并没有放到任一对象树中,所以你还是需要把data进行手动内存释放。

foxyz 发表于 2022-10-21 13:46:17

不需要你去delete释放。因为QClipboard::setMimeData本身就会发生所有权转移。你new出来的mimedata由clipboard管理了。你可以显式调用clipboard的clear函数清除。
void QClipboard::setMimeData(QMimeData *src, QClipboard::Mode mode = Clipboard)
Sets the clipboard data to src. Ownership of the data is transferred to the clipboard. If you want to remove the data either call clear() or call setMimeData() again with new data.
The mode argument is used to control which part of the system clipboard is used. If mode is QClipboard::Clipboard, the data is stored in the global clipboard. If mode is QClipboard::Selection, the data is stored in the global mouse selection. If mode is QClipboard::FindBuffer, the data is stored in the search string buffer.
页: [1]
查看完整版本: QMimeData问题:new了一个QMimeData,是否需要释放