2016-06-21 5 views
-3

Вот как я устанавливаю указатель на struct. При выполнении сегментации ошибка сегментации во второй строке. LoadedPDFInfo является структура в Canvas пространстве именДоступ к элементу struct через unique_ptr дает ошибку сегментации

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

C++ не является C не C++! – Olaf

+0

@ Олаф, есть ли у вас ответ? – asad

+1

Как бы я? Хрустальный шар туман, и я не ясновидящий. См. [Ask]. – Olaf

ответ

3

Во-первых, std::unique_ptr является class не struct, поэтому избавиться от приставки struct на объявлении переменной pdfInfo. Вы, вероятно, думал об этом вместо:

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

Но даже при объявлении переменных (или типа литья) с использованием фактических struct типов, вы все равно не нужен префикс struct. C нуждается в этом, C++ - нет.

Во-вторых, ваша происходит выдаёт ошибку сегментации, потому что вы просто объявили переменную pdfInfo, но на самом деле не указывает на действительный LoadedPDFInfo объекта, поэтому с помощью оператора -> не является законной операцией. Точно так же, как обычный указатель, std::unique_ptrstd::auto_ptr и std::shared_ptr) должны указать что-нибудь, чтобы получить доступ к что-то пользователей. Например:

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

Другим вариантом является 'auto pdfInfo = std :: make_unique ();', что уменьшает дублирование кода при упоминании имени типа дважды –

+0

'std :: make_unique()' был добавлен в C++ 14, который еще широко не используется. Однако вы можете написать эквивалентную функцию в C++ 11. Кроме того, реальная цель 'std :: make_unique()' больше для улучшения управления памятью, а не для лучшей читаемости кода. Кроме того, вызов конструктора 'std :: unique_ptr' напрямую имеет одно преимущество - вы можете решить, откуда появился указатель объекта, вам не нужно вызывать' new' непосредственно в конструкторе, например: 'std :: unique_ptr < Canvas :: LoadedPDFInfo> pdfInfo (GetLoadedPDFInfoPointer()); ', хотя в этом случае вы, вероятно, должны использовать' std :: shared_ptr'. –

+1

'make_unique' не имеет лучшего управления памятью, чем' new'. Он имеет лучшую защиту для исключений в случаях, когда у вас есть несколько распределений без точки последовательности. –

Смежные вопросы