2017-01-02 8 views
0

Ich benutze Taglib und schreibe das Cover zum mp3. Der folgende Code funktioniert hier:Delete oder Smart Pointer Fehler

bool MediaHelper::AddCoverArt(const QString &media, const QString &image_file) 
{ 
    TagLib::MPEG::File mpeg(media.toStdString().c_str()); 
    TagLib::ID3v2::Tag *id3v2Tag = mpeg.ID3v2Tag(true); 
    TagLib::ID3v2::AttachedPictureFrame *frame = new TagLib::ID3v2::AttachedPictureFrame; 
    frame->setMimeType("image/jpeg"); 
    frame->setPicture(image.data()); 
    id3v2Tag->addFrame(frame); 
    mpeg.save(); 
    delete frame; 
    return true; 
} 

aber sobald ich die Funktion, die App stürzt mit Lesezugriffsverletzung verlassen

Ich habe dann versucht es mit einem QScopedPointer:

bool MediaHelper::AddCoverArt(const QString &media, const QString &image_file) 
{ 
    TagLib::ID3v2::Tag *id3v2Tag = mpeg.ID3v2Tag(true); 
    QScopedPointer<TagLib::ID3v2::AttachedPictureFrame> frame(new TagLib::ID3v2::AttachedPictureFrame); 
    frame->setMimeType("image/jpeg"); 
    frame->setPicture(image.data()); 
    id3v2Tag->addFrame(frame.data()); 
    mpeg.save();  
    return true; 
} 

Aber gleiche passiert, wenn Ich verlasse die Funktion. Ich bin ein bisschen ratlos, denn wenn ich mich nicht darum kümmere Frame zu löschen, werde ich ein großes Problem für mich selbst schaffen. Wenn mir jemand Einblick geben kann.

Antwort

3

Von der TagLib API-Dokumentation:

Leere TagLib :: ID3v2 :: Tag :: ADDFRAME (Frame * Rahmen)

einen Rahmen mit dem Tag hinzufügen. An diesem Punkt übernimmt das Tag den Besitz des Rahmens und behandelt den Speicher freizugeben.

Das Tag löscht den Frame. Wenn Sie den Frame auch selbst löschen, erhalten Sie eine doppelte Löschung, und wenn das Tag auf den Frame zugreift, bevor es in seinem Destruktor gelöscht wird, würde dies ebenfalls zu einer Zugriffsverletzung führen.

+0

Danke Ich schaute auf die Beschreibung der Dokumentation, aber nicht die Funktionen. Danke, dass du es für mich aufgeräumt hast – adviner