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_ = "";
}