2012-10-23 84 views
1

假設我有一個創建QIODevice(例如QFile)的函數,然後返回一個指向由QIODevice構造的QDataStream的指針。在這裏處理內存分配的最佳方式是什麼?很顯然,QIODevice必須被堆分配以在函數終止時保持可用於QDataStream,但是QDataStream的銷燬不會破壞或關閉設備。有沒有處理這個看似普遍的問題的標準方法? 理想情況下,我想要一個返回一個對象(不是指向對象的指針)的函數,該對象的行爲類似於QDataStream,但銷燬後會關閉設備。有效的標準庫輸入流。QDataStream QIODevice內存分配

示例代碼:

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

回答

5
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。爲更正。

+1

我想你的意思是QSharedPointer(QScopedPointer不能被複制)。 –

+0

@RA。好電話編輯相應。 –

+0

謝謝,就是我想要的。 – Dylan