2016-12-21 25 views
0

를 반환 내가 Qt는 라벨의 이미지를 보여주고 싶어요. QByteArray의 형식으로 이미지 데이터를 가져 오는 중이며 레이블에로드 중입니다.500 배 주위에 이미지를로드 한 후,이 오류는 비주얼 스튜디오 QImage에서 보여줍니다 메모리 부족을, 널 (null) 이미지

QPixmap *pixmapTest; 
pixmapTest = NULL; 

다음 코드를 호출하기되는 함수에 여러 번

은 생성자에 정의 : 아래 코드입니다 약 500 번이 함수를 호출 한 후

RequestCompleted(QNetworkReply *reply) 
{ 
if(pixmapTest){ 
    qDebug()<<"delete showImage Pixmap Object"; 
    delete pixmapTest; 
    pixmapTest = NULL; 
} 
pixmapTest = new QPixmap(); 
QByteArray jpegData = reply->readAll(); 
pixmapTest->loadFromData(jpegData); 
ui.qtLabel->setPixmap(*pixmapTest); 
} 

I 이 오류가 발생했습니다

QImage: out of memory, returning null image. 

나는 아니오 위의 코드에서 오류가 발생하지 않습니다. 누군가가 해결 방법을 알려주시겠습니까?

+1

는 소리. 아마'jpegData' ... – dtech

+0

새로운 픽스맵 객체를 만들 때마다 이상하게 보일 것입니다.'pixmapTest'를 한 번 만들고 나서'loadFromData'를 호출하는 것이 가장 좋습니다. 참조 : http://stackoverflow.com/questions/15316008/qimage-out-of-memory-returning-null-image를 –

+0

난 당신이 어떤 점에서 (pixMapTest) 삭제를 할 필요가 가정합니다. 또는 shared_ptr – pm100

답변

1

우선 할당하고 이해가 충분하지 않습니다 여러 번 호출되는 함수의 변수 (pixmapTest) 메모리를 해제 할당. 먼저 메모리를 할당하고 모두 할당 해제를 완료해야합니다. 예 :

pixmapTest = new QPixmap(); 

for(size_t i = 0; i < 1000; i++){ 
    // Call that function 
} 

delete pixmapTest; 

외에도 메모리 누수가 발생하는 것 같습니다. pixmapTest을 삭제하면 jpegData가 가리키는 메모리가 삭제되지 않습니다. 따라서 각 함수 호출에서 jpegData이 가리키는 메모리를 처리해야합니다.

+0

과 같은 스마트 포인터에 넣어 주셔서 감사합니다. 나는 이러한 오류를 얻고이 일에 – sk110

0

대부분의 경우, 당신은 reply 자체를 해제 아닙니다. 픽스맵을 저장할 수 없으며, 포인터를 통해 관리 할 필요가있다

없습니다. 가치에 따라 그것을 지키고 답장을받을 때마다 새로운 가치를 부여하십시오. 메모리를 유출하는 것처럼

예컨대 :

class MyClass : public QWidget { 
    Q_OBJECT 
    Ui::MyClass ui; 

    explicit MyClass(QWidget *parent = nullptr) : QWidget(parent) { 
    ui.setupUi(this); 
    } 

    Q_SLOT void requestCompleted(QNetworkReply *reply) { 
    QPixmap pix; 
    pix.loadFromData(reply->readAll()); 
    ui.qtLabel->setPixmap(pix); 
    reply->deleteLater(); 
    } 
}; 
+0

는 픽스맵이에서 널 픽스맵 보기 [http://stackoverflow.com/questions/41276248/getting-pixmap-is-a-null-pixmap-on-calling-a-입니다 function-500-times] – sk110

+0

글쎄,받은 데이터가 올바른 형식이 아닐 수도 있습니다. 어떻게 그걸 알 수 있니? 이를 확인하고 코드가 의미가 있음을 확인하십시오. "이봐, 작동하지 않는다"고 말하는 것이 아니라 질문 할 질문을 알기 위해 문제를 충분히 이해해야합니다. –

+0

당신의 소중한 제안에 감사드립니다. 나는 다음 질문을하기 전에이 성명서를 유념 할 것이다. – sk110