分段错误: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_ptrmake_shared<T>(...)
可能比shared_ptr<T>(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的主要内容,如果未能解决你的问题,请参考以下文章