增强变体析构函数导致分段错误

时间:2011-11-10 11:47:04

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

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

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

我的变体定义如下:

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

变体的所有元素都是延迟的。延迟构造启用对象的延迟构造。这似乎是在访问其中一个字段之前没有构造对象。真实对象由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;
};

当删除指令向量时,在此特定函数中删除变量时会发生分段错误:

  boost :: variant&lt;中的

0x0000000000d71972 eddic :: Deferred&lt; eddic :: FunctionCall,std :: shared_ptr&lt; eddic :: FunctionCall&gt; &gt;,eddic :: Deferred&gt;,eddic :: Deferred&lt; eddic :: Declaration,std :: shared_ptr&lt; eddic ::宣言&GT; &gt;,eddic :: Deferred&lt; eddic :: Assignment,std :: shared_ptr&lt; eddic :: Assignment&gt; &gt;,eddic :: Deferred&lt; eddic :: If,std :: shared_ptr&lt; eddic :: If&gt; &gt;,eddic :: Deferred&lt; eddic :: while,std :: shared_ptr&lt; eddic ::虽然&GT; &gt;,eddic :: Deferred&lt; eddic :: Foreach,std :: shared_ptr&lt; eddic :: FOREACH&GT; &gt;,eddic :: Deferred&lt; eddic :: For,std :: shared_ptr&lt; eddic ::对于&GT; &gt;,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_&gt; :: using_backup()const()

编辑2:删除recursive_wrapper和intrusive_ptr进行测试后,错误现在是一个boost的断言:Boost.Variant内部错误:超出范围。

对于破坏变体是否有一些限制?像某些我们不能放入变体的类?

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

编辑:它可以来自这样一个事实,即变体包含多次Deferred,Deferred,......?

1 个答案:

答案 0 :(得分:1)

我不确切知道你需要什么语义,但是你可以像这样简化变体结构树:

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