添加非const方法会导致Seg Fault

时间:2018-04-16 15:02:36

标签: c++17

当我将方法setValue添加到下面的ClazzI时,我正在观察未定义的行为/ seg错误。删除此方法可以消除此问题;但是,我无法在一个简单的例子中重现。下面大致概述了正在做的事情,似乎真正的问题涉及在非const函数中触摸成员向量。

class AnotherClazz;

using AnotherClazzPtr = std::shared_ptr<AnotherClazz>;

class AnotherClazz {
public:
    AnotherClazz(const std::vector<double>& values)
        :m_values(values)
    {}

    std::vector<double> m_values;
};

class ClazzI;

using ClazzPtr = std::shared_ptr<ClazzI>;

class ClazzI {
  public:
    virtual void setValue(size_t i, double value) = 0;

    virtual ClazzPtr clone() const = 0;

    virtual ~ClazzI() = default;
};

class Clazz : public ClazzI {
  public:
    Clazz(const std::vector<double>& values)
        :m_values(values)
        , m_another(std::make_shared<AnotherClazz>(m_values))
    {}

    void setValue(size_t i, double value) override {
        m_values.at(i) = value;
        m_another = std::make_shared<AnotherClazz>(m_values);
    }

    ClazzPtr clone() const override {
        return std::make_shared<Clazz>(m_values);
    }
private:
    std::vector<double> m_values;
    AnotherClazzPtr m_another;
};

调用克隆,而setValue函数似乎触发了析构函数调用,然后导致了下面的内容。

Segmentation fault (Invalid permissions for mapped object [0x55a3b0309540])

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

1 个答案:

答案 0 :(得分:0)

我已经确定了问题所在,虽然它与源完全无关,并且与我的构建输出中生成的坏符号有关。