Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 分段错误:共享\u ptr_C++_Segmentation Fault_Shared Ptr - Fatal编程技术网

C++ 分段错误:共享\u ptr

C++ 分段错误:共享\u ptr,c++,segmentation-fault,shared-ptr,C++,Segmentation Fault,Shared Ptr,我在共享ptr中遇到一些奇怪的行为,我无法解释为什么会发生这种情况: std::shared_ptr<QueryQualification> qualification = query->getQualification(); if (qualification != nullptr) { // add selection std::shared_ptr<Operator> selection = std::shared_ptr<Operato

我在共享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);
    ...
}
std::shared_ptr qualification=query->getQualification();
if(资格!=空PTR){
//添加选择
std::shared_ptr selection=std::shared_ptr(新选择(资格));
选择->设置LeftChild(扫描);
...
}
下面是导致分段错误的选择构造函数:

class Selection : public Operator {
public:
   Selection(std::shared_ptr<QueryQualification> qualificiation) : qualification(qualification) { }
...
private:
   std::shared_ptr<QueryQualification> qualification;
};
类选择:公共运算符{
公众:
选择(标准::共享的资格):资格(资格){
...
私人:
std::共享ptr资格;
};
我知道,我可以在这里使用移动语义来改进复制行为,但我想先获得一些运行代码

上述代码在所选构造函数中引发分段错误:

SelectionOperator.hpp(第24行)是上述选择构造函数的代码行

我真的不明白这里发生了什么,因为在将限定对象作为参数提供给选择之前,它是完全有效的

提前谢谢

类选择:公共运算符{
class Selection : public Operator {
public:
   Selection(std::shared_ptr<QueryQualification> qualification) : m_qualification(qualification) { }
...
private:
   std::shared_ptr<QueryQualification> m_qualification;
};
公众: 选择(标准::共享认证):m认证(认证){ ... 私人: std::共享ptr m_资格; };
此时查询是否为空?否,查询也有效。您可以看到这一点,因为std::shared_ptr qualification=query->getQualification();否则将导致分段错误。是的,
make_shared(…)
可能比
shared_ptr(new T(…)
更有效,因为它可以合并两个分配(以及相应的解除分配).表格中的拼写
qualification
似乎有误constructor@davidc它可能会提高可读性,但不是必需的;在
qualification(qualification)
中,第一个名称无疑是一个成员名称,第二个名称取自当前范围,其中参数名称隐藏了该成员。它仍然会做正确的事情,即使阅读起来很混乱。编辑:遗漏了拼写错误,当然这会导致问题。:)因为这个小错误不是错误发生的原因。