C++ 导致SEGTP故障的CRTP
我有一个纯虚拟类C++ 导致SEGTP故障的CRTP,c++,c++11,polymorphism,crtp,pure-virtual,C++,C++11,Polymorphism,Crtp,Pure Virtual,我有一个纯虚拟类接口: class Interface { public: virtual ~Interface() noexcept; virtual void open()=0; virtual void close()=0; protected: explicit Interface(const string params); string params_; } unique_ptr<Interface> intf; intf.
接口
:
class Interface {
public:
virtual ~Interface() noexcept;
virtual void open()=0;
virtual void close()=0;
protected:
explicit Interface(const string params);
string params_;
}
unique_ptr<Interface> intf;
intf.reset(new SPInterface("aaa"));
然后,我有一个抽象类,在其中实现我的业务逻辑:
template<typename T>
class AbstractInterface : public Interface {
public:
void open() override;
void close() override;
void read_is_complete(const vector<byte_array>);
protected:
explicit AbstractInterface(const string params);
virtual ~AbstractInterface() noexcept;
}
让它超出范围调用析构函数AbstractInterface
,析构函数反过来调用AbstractInterface
上的close方法,然后它在this
上执行segfaults:
template<typename T>
void AbstractInterface<T>::close() {
static_cast<T *>(this)->close();
params_ = "";
}
模板
void AbstractInterface::close(){
静态_cast(此)->close();
params_uquo;;
}
这让人困惑,因为我已经创建了这个类的一个实例。lldb似乎证实:
AbstractInterface<SPInterface>::close(this=<unavailable>)
AbstractInterface::close(this=)
让它离开作用域调用析构函数AbstractInterface,析构函数AbstractInterface反过来调用AbstractInterface上的close方法,然后它在以下情况下执行:
模板
void AbstractInterface::close(){
静态_cast(此)->close();
params_uquo;;
}
似乎您正试图从基类的析构函数中调用派生类的方法。
这一点都不安全,segfault是可执行文件告诉您它不批准的方式。:-) 即使CRTP允许您调用(比如)活动对象上属于派生类的成员函数,它也不会改变对象的销毁方式。
不要忘记,基类和成员的销毁顺序与其构造函数的完成顺序相反。尝试从基类的析构函数调用派生类的方法看起来安全吗?我想你有一点:)
AbstractInterface<SPInterface>::close(this=<unavailable>)
template<typename T>
void AbstractInterface<T>::close() {
static_cast<T *>(this)->close();
params_ = "";
}