2014-10-31 2 views
0

я встречаю какое-то странное поведение с shared_ptr, и я не могу объяснить, почему это происходит:Сегментация: shared_ptr

std::shared_ptr<QueryQualification> qualification = query->getQualification(); 
if (qualification != nullptr) { 
    // add selection 
    std::shared_ptr<Operator> selection = std::shared_ptr<Operator>(new Selection(qualification)); 
    selection->setLeftChild(scan); 
    ... 
} 

А вот конструктор выбора, который вызывает ошибку сегментации:

class Selection : public Operator { 
public: 
    Selection(std::shared_ptr<QueryQualification> qualificiation) : qualification(qualification) { } 
... 
private: 
    std::shared_ptr<QueryQualification> qualification; 
}; 

Я знаю, что я могу улучшить поведение копии с семантикой перемещения здесь, но сначала хочу получить код.

Код выше поднимает ошибку сегментации в конструктор выбора: The backtrace of the error

SelectionOperator.hpp (строка 24) в строку кода конструктора Selection выше.

Я действительно не понимаю, что здесь происходит, так как объект квалификации является совершенно действительным, прежде чем передать его в качестве аргумента.

Заранее благодарен!

+0

Является ли запрос null на данном этапе? – BlamKiwi

+0

Нет, запрос действительно. Вы можете видеть это, потому что std :: shared_ptr qualification = query-> getQualification(); в противном случае приведет к ошибке сегментации. – moo

+0

Что возвращает 'query-> GetQualification()' return? «Shared_ptr», «unique_ptr», владеющий raw-указателем, который вы должны «удалить», или не владеющий необработанным указателем? – Deduplicator

ответ

-1
class Selection : public Operator { 
public: 
    Selection(std::shared_ptr<QueryQualification> qualification) : m_qualification(qualification) { } 
... 
private: 
    std::shared_ptr<QueryQualification> m_qualification; 
}; 
+0

Почему это нисходящее? – davidc

+1

Поскольку эта небольшая ошибка не является причиной возникновения ошибки. –