2012-10-23 3 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도 생성자 인수로 Deleter를 제공 할 수있는 QSharedPointer 클래스와 함께이 기능을 제공합니다. 다른 포인터 래퍼 옵션이 있습니다. @RA에게 감사합니다. 수정을 위해.

+1

QSharedPointer (QScopedPointer를 복사 할 수 없음)를 의미한다고 생각합니다. –

+0

@RA. 적절하게 수정 된 전화입니다. –

+0

고마워, 내가 원한거야. – Dylan