【发布时间】: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_ptr
qualification = query->getQualification();否则已经导致分段错误。 -
是的,
make_shared<T>(...)可能比shared_ptr<T>(new T(...))更有效,因为它可以合并两个分配(以及相应的解除分配)。 -
构造函数中
qualificiation似乎有拼写错误 -
@davidc 它可能会提高可读性,但这不是必需的;在
qualification(qualification)中,第一个名称明确地是成员名称,第二个名称取自参数名称隐藏成员的当前范围。即使阅读起来令人困惑,它仍然会做正确的事情。 编辑: 错过了拼写错误,这当然会导致问题。 :)
标签: c++ segmentation-fault shared-ptr