Qt 如何';偷窃';来自QByteArray的数据,无副本

Qt 如何';偷窃';来自QByteArray的数据,无副本,qt,Qt,是否可以将指针指向QByteArray的内部T*数据并销毁QByteArray本身,使指针保持不释放状态?我想在类似于以下场景的场景中使用它: const char* File::readAllBytes(const String& path, u64& outCount) { QFile file(*static_cast<QString*>(path.internal())); outCount = static_cast<u64>(f

是否可以将指针指向
QByteArray
的内部
T*数据
并销毁
QByteArray
本身,使指针保持不释放状态?我想在类似于以下场景的场景中使用它:

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();
}
const char*文件::readAllBytes(const字符串和路径、u64和outCount){
QFile文件(*static_cast(path.internal());
outCount=static_cast(file.size());
如果(!file.open(QIODevice::ReadOnly))gException(“无法打开文件”);
const QByteArray数组=file.readAll();
返回array.steal();
}

不,您不能窃取
QByteArray
的指针,除非它是用
QByteArray::fromRawData
构造的,但事实并非如此。但是,您可以手动创建char数组,并使用
QFile::read(char*data,qint64 maxSize)
将数据从文件中读取到其中。然后,您将决定将指针传递到何处以及何时删除它

请注意,这不被视为良好做法。您应该尽可能使用托管分配,Qt提供了足够的资源来覆盖大多数可能的用例。你不应该这样做,除非你试图做一些真正低级的事情


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

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

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;
}
我觉得
String
是一种与框架无关的字符串包装器。也许您可以选择
std::u16string
来携带与
QString
相同的UTF16数据

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