c++ - 为什么正则表达式析构函数中存在存储错误?

标签 c++ regex destructor

当我的代码破坏正则表达式时,我遇到了存储错误,我对原因感到困惑。我怀疑我错过了关于正则表达式的一些愚蠢的东西。

一些背景知识:我是一名相当有经验的 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/

相关文章:

c++ - 什么情况下必须使用 "this"指针?

c++ - 如何在没有 Obj-C 代码的情况下将 NSString 转换为 C++ 中的 CString?

C++:从对象指针 vector 中删除元素而不删除它指向的对象的正确方法是什么?

javascript - url 和 markdown 之类图像的正则表达式

c++ - 跳过声明时,为什么需要琐碎的析构函数?

c++ - 如何正确使用std::transform和std::mem_fn?

PHP - 检测字符串之间的空格

regex - 数字类型字段的 Mongoose find() RegExp

c++ - 为什么定义析构函数会删除隐式定义的移动赋值运算符?

c++ - "replaced"变量何时不再可寻址