gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:34:01 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com