c++ - QDataStream QIODevice 内存分配

标签 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;
}

最佳答案

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/

相关文章:

c++ - epoll 或 kqueue 是否可以处理向自身异步添加文件描述符

c++ - 欧拉计划问题 17 - 怎么了?

c++ - 在 Google Test 中,我可以从构造函数中调用 GetParam() 吗?

java - org.openqa.selenium.remote.UnreachableBrowserException

python - 将参数传递给 QWidget.mousePressEvent

c++ - 在 Windows 7 上编译源 Qt 4.7.4 错误 qmake 不是内部或外部命令

c++ - 如何超链接到 QAbstractItemModel 中的项目?

c++ - 如何获取 C++ 类成员 vector 的大小?

c++ - 从文件中读取字符串。 QTextStream 不读取文件

c++ - QVector<int>[index] 返回另一个 QVector?