Boost变量析构函数导致分段错误

boost variant destructors results in segmentation fault

本文关键字:分段 错误 变量 析构函数 Boost      更新时间:2023-10-16

我遇到了一个使用Boost变体的问题。当变量被破坏时,我有一个分段错误。

奇怪的是,只有当我没有激活编译器的优化(在我的情况下是GCC)时,才会出现这种分段错误。例如,在O1、O2、O3模式下,我运行代码没有问题。

我的变量定义如下:

typedef boost::variant<
            ASTFunctionCall, 
            ASTSwap, 
            ASTDeclaration,
            ASTAssignment, 
            ASTIf,
            ASTWhile,
            ASTForeach,
            ASTFor>
        ASTInstruction;

该变量的所有元素都是Deferred类型的。Deferred构造允许对象的延迟构造。似乎在访问对象的一个字段之前没有构造对象。真正的对象是由shared_ptr支持的。

这个错误发生在父类的销毁中:

struct FunctionDeclaration { 
    std::shared_ptr<FunctionContext> context;
    std::string returnType;
    std::string functionName;
    std::string mangledName;
    std::vector<FunctionParameter> parameters;
    std::vector<ASTInstruction> instructions;
};

当指令向量被删除时,当变体在该特定函数处被删除时发生分段故障:

0x0000000000d71972 in boost::variant <古冰岛诗集的::延迟& lt;eddic::FunctionCall, std::shared_ptr >, eddic::Deferred>, eddic::Deferred >,eddic::Deferred >, eddic::Deferred >, eddic::Deferred >, eddic::Deferred >, eddic::Deferred >,boost::::变体:void_ boost::::变体:void_ boost::::变体:void_ boost::::变体:void_ boost::::变体:void_ boost::::变体:void_ boost::::变体:void_,Boost::detail::variant::void_, Boost::detail::variant::void_, Boost::detail::variant::void_, Boost::detail::variant::void_, Boost::detail::variant::void_, Boost::detail::variant::void_>::using_backup() const ()

编辑2:删除recursive_wrapper和intrusive_ptr到test后,错误现在是boost: boost的断言。变量内部错误:超出范围。

销毁的变体有限制吗?就像某种我们不能放入变体中的类?

事先感谢你对这个问题的任何建议

编辑:这可能是因为变体包含了多次Deferred, Deferred,…?

我不知道你到底需要什么语义,但是你能像这样简化变量结构树吗?

typedef boost::variant<
        ASTFunctionCall, 
        ASTSwap, 
        ASTDeclaration,
        ASTAssignment, 
        boost::recursive_wrapper<
            boost::variant<ASTIf, ASTWhile, ASTForeach, ASTFor> >
    ASTInstruction;

?