应用程序希望将字符串方程解析为数学并将数据返回给用户。为此,使用的库是exprtk
为了便于分析,我分享了最小工作代码 最小工作代码
当应用程序将字符串解析为背靠背的代码时[多线程但锁定]
void reset()
{
// Why? because msvc doesn't support swap properly.
//stack_ = std::stack<std::pair<char,std::size_t> >();
/**
it was crashing on destructor on ~deque()
stating memory reallocation
so I change it to pop so for now this has been resolved
*/
while(stack_.size()) stack_.pop();
state_ = true;
error_token_.clear();
}
现在代码总是崩溃
static inline void destroy(control_block*& cntrl_blck)
{
if (cntrl_blck)
{
/**now crashes on this condition check*/
if ( (0 != cntrl_blck->ref_count) && (0 == --cntrl_blck->ref_count) )
{
delete cntrl_blck;
}
cntrl_blck = 0;
}
}
更新
pastebin 代码使用 main 更新的新代码已添加主要和最小工作代码。所有的shared_ptr
已被删除。现在它们是正常的对象。至于exprtk的reset功能已经改成原来的了
void reset()
{
// Why? because msvc doesn't support swap properly.
stack_ = std::stack<std::pair<char,std::size_t> >();
state_ = true;
error_token_.clear();
}
并且gdb的回溯已添加回溯