QDataStream QIODevice内存分配

Dyl*_*lan 2 c++ qt

假设我有一个创建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)

Mat*_*ips 5

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.为了纠正.