c++ - boost 变体析构函数导致段错误

标签 c++ gcc boost segmentation-fault boost-variant

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

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

我的变体是这样定义的:

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

variant的所有元素都是一些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;
};

当指令 vector 被删除时,当变量的删除发生在这个特定的函数时,就会发生段错误:

0x0000000000d71972 in boost::variant < eddic::Deferred < eddic::FunctionCall, std::shared_ptr < eddic::FunctionCall > >, eddic::Deferred >, eddic::Deferred < eddic::Declaration, std::shared_ptr < eddic::Declaration> >, eddic::Deferred < eddic::Assignment, std::shared_ptr < eddic::Assignment > >, eddic::Deferred < eddic::If, std::shared_ptr < eddic::If > >, eddic::Deferred < eddic::While, std::shared_ptr < eddic::While> >, eddic::Deferred < eddic::Foreach, std::shared_ptr < eddic::Foreach> >, eddic::Deferred < eddic::For, std::shared_ptr < eddic::For> >, boost::detail::variant::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_, 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 进行测试后,错误现在是 boost 断言:Boost.Variant 内部错误:超出范围。

销毁变体是否有一些限制?就像我们不能放入变体的某种类?

提前感谢有关此问题的任何想法

编辑:它是否来自变体多次包含 Deferred、Deferred、... 的事实?

最佳答案

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

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

?

关于c++ - boost 变体析构函数导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8079017/

相关文章:

c++ - 如何使映射键具有两种不同的数据类型?

c++ - 为什么cout会阻止后续代码在这里运行呢?

C 乘法或加法浮点结果 NaN

c++ - 用 C++ 实现异步惰性生成器

Python 打包 : Boost library as dependency

c++ - 我应该初始化抽象类的成员吗?

c++ - 无法在 C++ 中为二维数组输入值

Qt、GCC、SSE 和堆栈对齐

c - GCC 将标准 header 与同名的个人 header 混淆

c++ - Boost.Log 忽略重载的流插入运算符