【问题标题】:C/C++ Memory Leak (Using PCRE)C/C++ 内存泄漏(使用 PCRE)
【发布时间】:2011-01-08 12:31:05
【问题描述】:
// Returns a list of topic numbers found on the page
vector<string> findTopics(char* rData, int rDataLen) {
    pcre *re;
    const char *error;
    int erroffset;
    re = pcre_compile(
        "topic/([0-9]+)",   /* the pattern */
        0,          /* default options */
        &error,         /* for error message */
        &erroffset,     /* for error offset */
        NULL);          /* use default character tables */

    if(re == NULL) {
    printf("Couldn't compile regex (%s)", error);
        //  exit(-1):
    }

    int regOf[2];
    vector<string> topics;

    char *topic;
    int offset = 0;
    int rc = 1;
    // Basically a preg_match_all()
    while(true) {
        rc = pcre_exec(re, NULL, rData, rDataLen, offset, 0, regOf, sizeof(regOf));
        if (rc < 2) {
            break;
        }

        topic = new char[8];
        sprintf(topic, "%.*s\n", regOf[2*1+1] - regOf[2*1], rData + regOf[2*1]);

        topics.push_back(topic);
        offset = regOf[1];
    }

    pcre_free(re);

    return topics;
}

这个函数应该获取一个“主题”列表(匹配topic/[0-9]+),在我解析的特定内容中找到,在rData 中,它几乎可以工作。 topics 填满了它应该填写的主题编号。

当我在 Visual Studio 中调试它时,我在函数结束(返回)后立即收到以下错误消息:运行时检查失败 #2 - 变量“regOf”周围的堆栈已损坏。

我不知道自己做错了什么,想知道是否有人可以为我指出正确的方向。

【问题讨论】:

    标签: c++ c memory-leaks pcre


    【解决方案1】:

    您使用 2 个元素定义 regOf。然后将 sizeof(regOf) 传递给 pcre_exec 函数,但是该函数询问数组中有多少项,而不是它的大小字节数。因此,该函数认为它有 8 个插槽要填充,它只有 2 个,因此可能会跑出数组的末尾并损坏内存。

    【讨论】:

    • 在另一个已经消失的答案中也提到过,您在进入主题时也应该小心。由于它只有 8 个字符长,因此您最多可以在其中放入 7 个字符的字符串,否则会溢出缓冲区的末尾。
    【解决方案2】:

    对于其他答案,如果您在 pcre_compilepcre_free 之间的任何语句引发异常(我看到其中至少有三个可以这样做),那么您就会泄漏内存。

    【讨论】:

      猜你喜欢
      • 2016-01-27
      • 2010-11-11
      • 2017-02-18
      • 1970-01-01
      • 2012-02-03
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      • 2015-11-19
      相关资源
      最近更新 更多