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

10-11 22:48