C++ 删除FrontendAction中的DiagnosticConsumer将导致segfault
我正在写一个基于叮当声前端的工具。 这是我对thC++ 删除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 {
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)
将myDiagnosticCustomer
设置为前端将使用的配置。它不允许我编辑我的注释,因此这里是:是。这是一个复制粘贴错误。谢谢你的帮助。我懒得看签名。你的问题让我看了看setClient
还有第二个参数,setClient(DiagnosticConsumer*client,bool ShouldOwnClient=true)
这解释了调用delete
会导致segfault的原因。现在修好了。我的目标比我想象的寿命还要长。很高兴你的问题解决了。为了将来的参考,请提供一个包含所有必要代码的最小可编译示例。这将帮助你更快地得到答案。