在FrontendAction中删除DiagnosticConsumer会导致段错误

时间:2017-05-27 18:13:49

标签: c++ initialization clang llvm destructor

我正在编写一个基于clang前端的工具。 这是我对DiagnosticConsumer和FrontendAction的替代。 运行此操作会导致段错误。如果我只是从FrontendAction中删除delete BDCProto;,它就不会导致段错误 我糊涂了。为什么我不能删除我在类dtor中的类中创建的对象?我并不喜欢这些范围。没有人试图在dtor之后使用那个指针,对吧? 我做错了什么?

class BlankDiagConsumer : public clang::DiagnosticConsumer
{
  BlankDiagConsumer() = default;
  virtual ~BlankDiagConsumer();
  virtual void HandleDiagnostic(DiagnosticsEngine::Level, const Diagnostic &Info) override {}
};



class LiveActionListVars : public ASTFrontendAction
{
  public:
    LiveActionListVars() {}
    ~LiveActionListVars() 
    {
      delete BDCProto;
    }

    void EndSourceFileAction() override {}

    std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, StringRef file) override
    {
      DiagnosticsEngine &DE = CI.getPreprocessor().getDiagnostics();
      DE.setClient(BDCProto);
      TheRewriter.setSourceMgr(CI.getSourceManager(), CI.getLangOpts());
      return llvm::make_unique<LiveListVarsConsumer>(TheRewriter);
    }

  private:
    Rewriter TheRewriter;
    BlankDiagConsumer* BDCProto = new BlankDiagConsumer;
};

0 个答案:

没有答案