假设我有一个函数,它创建一个 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/