我遇到使用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,......?
答案 0 :(得分:1)
我不确切知道你需要什么语义,但是你可以像这样简化变体结构树:
typedef boost::variant<
ASTFunctionCall,
ASTSwap,
ASTDeclaration,
ASTAssignment,
boost::recursive_wrapper<
boost::variant<ASTIf, ASTWhile, ASTForeach, ASTFor> >
ASTInstruction;