Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除FrontendAction中的DiagnosticConsumer将导致segfault_C++_Initialization_Clang_Llvm_Destructor - Fatal编程技术网

C++ 删除FrontendAction中的DiagnosticConsumer将导致segfault

C++ 删除FrontendAction中的DiagnosticConsumer将导致segfault,c++,initialization,clang,llvm,destructor,C++,Initialization,Clang,Llvm,Destructor,我正在写一个基于叮当声前端的工具。 这是我对thDiagnosticConsumer和FrontendAction的替代品。 运行此操作将导致SEGDAULT。如果我只是删除删除BDCProto从前端操作,它不会导致segfault。 我很困惑。为什么我不能删除在类dtor中的类中创建的对象?我可没拿望远镜开玩笑。没有人试图在dtor之后使用该指针,对吗? 我做错了什么 class BlankDiagConsumer : public clang::DiagnosticConsumer {

我正在写一个基于叮当声前端的工具。 这是我对th
DiagnosticConsumer
和FrontendAction的替代品。 运行此操作将导致SEGDAULT。如果我只是删除
删除BDCProto从前端操作,它不会导致segfault。
我很困惑。为什么我不能删除在类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;
};
class BlankDiagnosticConsumer:public clang::DiagnosticConsumer
{
BlankDiagConsumer()=默认值;
虚拟消费者();
虚拟无效句柄诊断(DiagnosticsEngine::Level,const Diagnostic&Info)重写{}
};
类LiveActionListVars:public ASTFrontendAction
{
公众:
LiveActionListVars(){}
~LiveActionListVars()
{
删除BDCProto;
}
void EndSourceFileAction()重写{}
std::unique_ptr CreateASTConsumer(编译器状态&CI,StringRef文件)重写
{
DiagnosticsEngine&DE=CI.getPreprocessor().getDiagnostics();
DE.setClient(BDCProto);
TheRewriter.setSourceMgr(CI.getSourceManager(),CI.getLangOpts());
返回llvm::使_唯一(TheRewriter);
}
私人:
重写器和重写器;
BlankDiagConsumer*BDCProto=新的BlankDiagConsumer;
};

您的代码甚至可以编译吗
BlankDiagConsumer
没有公共构造函数。这是复制粘贴错误吗?
DE.setClient(BDCProto)
在内部做什么?问题似乎与
CreateASTConsumer()
函数有关,因为这是显示的唯一修改
BDCProto
的函数。是的,这是一个复制粘贴错误
DE.setClient(BDCProto)
将my
DiagnosticCustomer
设置为前端将使用的配置。它不允许我编辑我的注释,因此这里是:是。这是一个复制粘贴错误。谢谢你的帮助。我懒得看签名。你的问题让我看了看
setClient
还有第二个参数,
setClient(DiagnosticConsumer*client,bool ShouldOwnClient=true)
这解释了调用
delete
会导致segfault的原因。现在修好了。我的目标比我想象的寿命还要长。很高兴你的问题解决了。为了将来的参考,请提供一个包含所有必要代码的最小可编译示例。这将帮助你更快地得到答案。