【问题标题】:Segmentation fault: shared_ptr分段错误: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) 中,第一个名称明确地是成员名称,第二个名称取自参数名称隐藏成员的当前范围。即使阅读起来令人困惑,它仍然会做正确的事情。 编辑: 错过了拼写错误,这当然会导致问题。 :)

标签: c++ segmentation-fault shared-ptr


【解决方案1】:
class Selection : public Operator {
public:
   Selection(std::shared_ptr<QueryQualification> qualification) : m_qualification(qualification) { }
...
private:
   std::shared_ptr<QueryQualification> m_qualification;
};

【讨论】:

  • 因为这个小错误不是错误发生的原因。
猜你喜欢
  • 1970-01-01
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 2020-05-03
  • 1970-01-01
  • 2016-02-24
  • 2021-11-12
  • 1970-01-01
相关资源
最近更新 更多