假设我有一个创建QIODevice(例如QFile)的函数,然后返回一个指向QIODevice构造的QDataStream的指针.在这里处理内存分配的最佳方法是什么?显然,QIODevice必须被堆分配以在函数终止时保持对QDataStream可用,但是QDataStream的破坏不会破坏或关闭设备.有没有一种标准的方法来处理这个看似常见的问题?理想情况下,我想要一个函数,它返回一个对象(不是指向对象的指针),其行为类似于QDataStream,但在销毁时会关闭设备.有效地是标准库输入流.
示例代码:
QDataStream* getStream(const QString& filename) {
QFile* file = new QFile(filename); // needs to be explicitly deleted later
file->open(QIODevice::ReadOnly);
QDataStream* out = new QDataStream(&file); // same here
return out;
}
Run Code Online (Sandbox Code Playgroud)
std::shared_ptr<QDataStream> getStream(const QString& filename)
{
QFile* file = new QFile(filename); // needs to be explicitly deleted later
file->open(QIODevice::ReadOnly);
std:shared_ptr<QDataStream> out(new QDataStream(&file), QDSDeleter);
return out;
}
void QDSDeleter(QDataStream* s)
{
QIODevice* device = s->device();
device->close();
delete device;
}
Run Code Online (Sandbox Code Playgroud)
std::unique_ptr是另一种选择,取决于您的需求; 如果你需要它,这里是前者的参考.
编辑:Qt还具有QSharedPointer类的功能,您还可以在其中提供删除器作为构造函数参数.其他指针包装选项在那里给出.谢谢@RA.为了纠正.
| 归档时间: |
|
| 查看次数: |
1023 次 |
| 最近记录: |