簡體   English   中英

如何釋放使用fromRawData()創建的QByteArray

[英]How to free QByteArray created with fromRawData()

該文檔指出以下內容

QByteArray不擁有數據所有權,因此,即使最后一個引用數據的QByteArray被銷毀,QByteArray析構函數也不會刪除原始數據。

考慮到這一點,如何釋放以這種方式創建的QByteArray

從概念上講-我猜想通過data()constData()在指針上調用free() ,但我真的不確定...這是說明用例的代碼示例:

void doTest() {
    QByteArray qba = partOne();
    partTwo(qba);
    finished(qba);
}

QByteArray partOne() {

    char *dataPtr = (char *)malloc(64);
    //do some stuff to dataPtr

    QByteArray qba = QByteArray::fromRawData(dataPtr, 64);
    //do some stuff to qba
    return qba;
}

void partTwo(QByteArray qba) {
    //do more stuff to qba
}

void finished(QByteArray qba) {
    //this?
    free((void *)qba.constData());
}

如何釋放以這種方式創建的QByteArray

很簡單-事實並非如此。 字節數組不擁有數據的所有權,因此您不會從字節數組中“釋放”它。

如果有必要釋放數據,則該責任應落在分配數據的代碼上。 完成字節數組的操作后,不再有對其的引用。

數據可能是“可釋放的”,也可能不是“可釋放的”,因此,您不應嘗試從字節數組中釋放它。 無論采用何種機制分配數據,都應處理其釋放。

memory allocation
    byte array construction
        byte array usage  
    byte array destruciton
memory deallocation

編輯:請記住,在您進行閱讀或編寫時,使用COW在“執行任務”和“執​​行任務”之間有很大的區別,因為在您編寫時,COW就會啟動,基礎數據將被復制,並且更改將應用​​於它,而不是原始數據。 自然,只有在一個以上的字節數組實例隱式共享數據時才會發生這種情況,例如在partTwo() 如果您不希望這種情況發生,請通過引用而不是副本傳遞。 顯然,如果啟動了COW,則從data()釋放內存將是一個問題,因為您將釋放由字節數組分配的新內存,而原始分配將變成內存泄漏。 因此,以下解決方案針對這種可能性。

void doTest() {
    char *dataPtr = (char *)malloc(64);
    //do some stuff to dataPtr
    {
        QByteArray qba = partOne(dataPtr);
        partTwo(qba);
    } // qba dies here
    free(dataPtr);
}  

QByteArray partOne(char *dataPtr) {
    QByteArray qba = QByteArray::fromRawData(dataPtr, 64);
    //do some stuff to qba
    return qba;
}

void partTwo(QByteArray qba) {
    //do more stuff to qba
}

完全不需要您手動管理內存:

QByteArray partOne() {
  QByteArray qba(64, Qt::Uninitialized);
  auto dataPtr = qba();
  // use dataPtr
  // do some stuff to qba
  return qba;
}

fromRawData沒有所有權,因此應該由擁有您需要釋放的數據的對象釋放內存。

從概念上講-我猜想通過.data()或.constData()在指針上調用free(),但是我真的不確定...

這是不正確的,因為您不能保證QByteArray不擁有數據。 例如,如果您修改QByteArray的內容,則將創建深層副本,並且該副本將由QByteArray析構函數釋放:

后續嘗試修改返回的QByteArray的內容或由此產生的任何副本,將導致它在進行修改之前創建數據數組的深層副本。 這樣可以確保原始數據數組本身不會被QByteArray修改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM