2011-01-08 77 views
1
// 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得到充滿它應該的主題數字。C/C++內存泄漏(使用PCRE)

當我在Visual Studio中調試它時,在函數結束後(返回),我得到了這個錯誤消息:運行時檢查失敗#2 - 變量'regOf'周圍的堆棧已損壞。

我無法弄清楚我做錯了什麼,並想知道是否有人可以指出我正確的方向。

回答

2

您使用2個元素定義regOf。然後您將sizeof(regOf)傳遞到pcre_exec函數中,但函數會詢問數組中有多少項,而不是多少個字節。因此,該函數認爲它有8個時隙填充,它只有2個,所以可以跑掉陣列的末尾和損壞的內存。

+0

在另一個回答中也提到了這個問題,從那以後消失了,你也應該小心這個衝刺到主題中。由於它只有8個字符長,所以最多可以放入7個字符的字符串,然後纔會溢出緩衝區的末尾。 –

+0

謝謝。它現在完美。 – Savetheinternet

2

除了其他答案,如果您在pcre_compilepcre_free之間的任何陳述出現異常(我發現至少有三個可能會這樣做),則會泄漏內存。