首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何“不复制”地从QByteArray中“窃取”数据

如何“不复制”地从QByteArray中“窃取”数据
EN

Stack Overflow用户
提问于 2015-06-28 13:05:41
回答 2查看 867关注 0票数 1

是否有可能获取指向QByteArray的内部T* data的指针并销毁QByteArray本身,从而使指针保持未释放状态?我想在类似于以下场景的情况下使用它:

代码语言:javascript
复制
const char* File::readAllBytes(const String& path, u64& outCount) {
    QFile file(*static_cast<QString*>(path.internal()));
    outCount = static_cast<u64>(file.size());
    if (!file.open(QIODevice::ReadOnly)) gException("Failed to open file");
    const QByteArray array = file.readAll();
    return array.steal();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-28 13:18:38

不,除非QByteArray指针是用QByteArray::fromRawData构造的,否则不能窃取它。但是,您可以手动创建char数组,并使用QFile::read(char * data, qint64 maxSize)将文件中的数据读取到它。然后,您将决定在哪里传递指针,以及何时将指针传递到delete[]

请注意,这不被认为是良好的做法。您应该尽可能地使用托管分配,而Qt提供的内容足以涵盖大多数可能的用例。你不应该这样做,除非你试图做一些真正低水平的事情。

请注意,许多Qt类,包括QStringQByteArray,都使用了写副本策略,因此通常不应该害怕复制它们并将它们传递到另一个上下文。

票数 3
EN

Stack Overflow用户

发布于 2016-12-23 19:46:32

不,但您可以通过不使用QByteArray轻松地避开这个问题。

代码语言:javascript
复制
const char* File::readAllBytes(const String& path, u64& outCount) {
    QFile file(*static_cast<QString*>(path.internal()));
    if (!file.open(QIODevice::ReadOnly)) return nullptr;
    auto N = file.bytesAvailable();
    char *data = malloc(N);
    outCount = file.read(data, N);
    return data;
}

上面的解决方案还假设数据的使用者知道需要free数据。

唉,使用这样一个API所要求的手动内存管理是个坏主意。如果不希望在API中使用Qt类,则应该使用std::vector<char>

代码语言:javascript
复制
std::vector<char> File::readAllBytes(const String& path) {
    std::vector<char> result;
    QFile file(*static_cast<QString*>(path.internal()));
    if (!file.open(QIODevice::ReadOnly)) return result;
    result.resize(file.bytesAvailable());
    auto count = file.read(result.data(), result.size());
    result.resize(count);
    return result;
}

我发现String是某种与框架无关的字符串包装器。也许您可以选择std::u16string来携带与QString相同的UTF16数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31100130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档