假设我有一个函数可以创建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;
}
最佳答案
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;
}
std::unique_ptr
是另一个选项,具体取决于您的需求。 here's a reference(如果需要的话)。编辑:Qt的QSharedPointer类也为此提供了便利,您还可以在其中提供删除器作为构造函数参数。那里提供了其他指针包装器选项。谢谢@RA。进行更正。
关于c++ - QDataStream QIODevice内存分配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13039614/