当我的代码破坏正则表达式时,我遇到了存储错误,我对原因感到困惑。我怀疑我错过了关于正则表达式的一些愚蠢的东西。
一些背景知识:我是一名相当有经验的 C++ 开发人员,但这是我第一次接触 regex 类。我的环境有点不寻常:我在 MS Visual C++ 中进行编辑和 alpha 测试,然后将代码带到另一个环境中。另一个环境完全符合 Posix,恰好是 IBM 大型机。该代码在 Windows 上运行良好,但在大型机上每次都失败。这个问题不是我的混合环境的根本问题:多年来,我一直以这种方式在这对环境中工作,并取得了 C++ 的完全成功。
我在类声明中定义正则表达式:
#include <regex>
...
class FilterEvalEGNX : public FilterEval
{
...
std::tr1::basic_regex<char> regexObject;
// I also tried plain regex with no difference
随后在类实现中,我为正则表达式分配了一个模式。代码应该比这更复杂,但我将其简化为分配一个静态字符串,以消除现实生活中处理字符串的方式可能产生的任何副作用。
std::tr1::regex::flag_type flags = std::tr1::regex::extended;
// I have also tried ECMA and it made no difference
try
{
static const char pat[] = "(ISPPROF|SPFTEMP)";
regexObject.assign(pat, flags);
}
catch (std::tr1::regex_error &e)
{
// handle regex error
}
这没有错误。当然,还有后续的模式匹配代码,但这不是问题的一部分:如果我在上面的代码之后立即销毁类,则会出现存储错误。
我没有对类析构函数中的正则表达式做任何事情。类的其他人已经工作多年了;我现在正在添加正则表达式。我认为正则表达式的某些“外部”覆盖不太可能。
这是导致错误的调用的回溯:
std::tr1::_EBCDIC::_Destroy(std::tr1::_EBCDIC::_Node_base*)
+00000066 40 CRTE128N Exception
std::tr1::_EBCDIC::basic_regex<char,std::tr1::_EBCDIC::regex
+000000C8 2022 FilterEvalEGNX.C Call
std::tr1::_EBCDIC::basic_regex<char,std::tr1::_EBCDIC::regex
+0000007C 1913 FilterEvalEGNX.C Call
FilterEvalEGNX::~FilterEvalEGNX()
regex第1913行附近的代码是
~basic_regex()
{ // destroy the object
_Tidy();
}
regex第2022行附近的代码是
void _Tidy()
{ // free all storage
if (_Rep && --_Rep->_Refs == 0)
_Destroy(_Rep);
_Rep = 0;
}
_Destroy() 似乎是在运行时实现的,我认为我没有源代码。
有什么想法吗?谢谢,
最佳答案
信不信由你,这似乎是 C++ 运行时中的一个错误。我调整了我的简单示例,现在我可以在 15 行的 main() 中复制该问题。我将由一些同行运行此程序,然后将其报告给 IBM。他们实际上修复了这些东西!他们不只是回答“是的,你发现了一个问题。”
关于c++ - 为什么正则表达式析构函数中存在存储错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49694638/