我在使用 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/