2016-06-21 10 views
-3

So setze ich Zeiger auf struct. Zur Laufzeit wird der Segmentierungsfehler in der zweiten Zeile ausgelöst. LoadedPDFInfo ist struct in Canvas-NamespaceZugriff auf Strukturelement über unique_ptr gibt Segmentierungsfehler

struct std::unique_ptr<Canvas::LoadedPDFInfo> pdfInfo; 
pdfInfo->handle = ++currentPDFHandle; 
pdfInfo->totalPageNum = FPDF_GetPageCount(doc); 
+2

C++ ist nicht C ist nicht C++! – Olaf

+0

@Olaf hast du eine antwort darauf? – asad

+1

Wie würde ich? Die Kristallkugel ist neblig und ich bin kein Hellseher. Siehe [fragen]. – Olaf

Antwort

3

Zuerst std::unique_ptr ist ein class kein struct, so der auf der pdfInfo Variablendeklaration struct Präfix loszuwerden. Sie dachten wohl dieser Stelle:

std::unique_ptr<struct Canvas::LoadedPDFInfo> pdfInfo; 

Aber selbst wenn das Deklarieren von Variablen (oder Typ-Casting) tatsächliche struct Typen verwenden, können Sie die struct Präfix noch nicht brauchen. C benötigt das, C++ nicht.

Zweitens Ihre segfault geschieht, weil Sie lediglich den pdfInfo Variable deklariert haben, aber es ist nicht wirklich an einem gültigen LoadedPDFInfo Objekt zeigt, so den -> Operator ist keine gültige Operation. Genau wie ein normaler Zeiger, std::unique_ptr (und std::auto_ptr, und std::shared_ptr) müssen Punkt auf etwas, um auf zugreifen, dass etwas ist Mitglieder. Zum Beispiel:

std::unique_ptr<Canvas::LoadedPDFInfo> pdfInfo(new Canvas::LoadedPDFInfo); 
+1

Eine andere Option ist 'auto pdfInfo = std :: make_unique ();', die Code-Duplikation reduziert, indem der Typname zweimal erwähnt wird –

+0

'std :: make_unique()' wurde in C++ hinzugefügt 14, das ist noch nicht weit verbreitet. Sie können jedoch eine äquivalente Funktion in C++ 11 schreiben. Der eigentliche Zweck von 'std :: make_unique()' ist außerdem mehr für eine bessere Speicherverwaltung, nicht für eine bessere Lesbarkeit des Codes. Außerdem hat das direkte Aufrufen des 'std :: unique_ptr'-Konstruktors einen Vorteil - Sie können entscheiden, woher der Objektzeiger kommt, Sie müssen' new' nicht direkt im Konstruktor aufrufen, zB: 'std :: unique_ptr < Canvas :: LoadedPDFInfo> pdfInfo (GetLoadedPDFInfoPointer()); ', obwohl Sie in diesem Fall wahrscheinlich' std :: shared_ptr' verwenden sollten. –

+1

'make_unique' hat keine bessere Speicherverwaltung als' new'. Es hat eine bessere Ausnahmesicherheit in Fällen, in denen Sie mehrere Zuweisungen ohne einen Sequenzpunkt haben. –

Verwandte Themen