分段错误:shared_ptr

Posted

技术标签:

【中文标题】分段错误:shared_ptr【英文标题】:Segmentation fault: shared_ptr 【发布时间】:2014-10-31 21:27:56 【问题描述】:

我在 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);
    ...

这里是导致分段错误的 Selection 的构造函数:

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

我知道,我可以在这里使用移动语义改进复制行为,但我想先获得一些运行代码。

上面的代码在 Selection 的构造函数中引发了分段错误:

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

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

提前致谢!

【问题讨论】:

此时查询是否为空? 不,查询也是有效的。你可以看到,因为 std::shared_ptrqualification = query->getQualification();否则已经导致分段错误。 是的,make_shared&lt;T&gt;(...) 可能比shared_ptr&lt;T&gt;(new T(...)) 更有效,因为它可以合并两个分配(以及相应的解除分配)。 构造函数中qualificiation似乎有拼写错误 @davidc 它可能会提高可读性,但这不是必需的;在qualification(qualification) 中,第一个名称明确地是成员名称,第二个名称取自参数名称隐藏成员的当前范围。即使阅读起来令人困惑,它仍然会做正确的事情。 编辑: 错过了拼写错误,这当然会导致问题。 :) 【参考方案1】:
class Selection : public Operator 
public:
   Selection(std::shared_ptr<QueryQualification> qualification) : m_qualification(qualification)  
...
private:
   std::shared_ptr<QueryQualification> m_qualification;
;

【讨论】:

因为这个小错误不是错误发生的原因。

以上是关于分段错误:shared_ptr的主要内容,如果未能解决你的问题,请参考以下文章

打印分段错误原因[重复]

如何调试 Python 分段错误?

为啥此代码会导致分段错误错误?

分段控制错误选择索引

分段错误背包问题

是啥导致发生分段错误?