当我将方法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)
答案 0 :(得分:0)
我已经确定了问题所在,虽然它与源完全无关,并且与我的构建输出中生成的坏符号有关。