gpt4 book ai didi

c++ - QDataStream QIODevice内存分配

转载 作者:搜寻专家 更新时间:2023-10-31 00:41:33 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com