[英]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.