Xerces-c: головоломка XMLString::transcode

У меня есть этот фрагмент кода:

void startElement(const XMLCh* const uri, const XMLCh* const localname,
    const XMLCh* const qname, const Attributes& attrs) {
    char* temp = XMLString::transcode(localname);
    if (strcmp(temp, "thread") == 0) {
        char* threadID = XMLString::transcode(
            attrs.getValue(emptyStr, tidStr));
        long int tid = strtol(threadID, &threadID, 16); //hex
        if (tid != current) {
            current = tid;
            cout << "Now made " << ++switches 
                << " thread switches and in thread ";
            cout << current;
            if (!(threadbitmap & 1 << tid - 1)) {
                count++;
                threadbitmap = threadbitmap |
                    1 << tid - 1;
            }
            cout << " of " << count << " threads." << endl;
        }
        //XMLString::release(&threadID);
    }
    XMLString::release(&temp);
} 

Что меня озадачивает, так это необходимость закомментировать выпуск threadID - если я этого не сделаю, код сразу же выдаст ошибки при удалении плохого указателя. Но поскольку threadID является результатом XMLString::transcode, его, конечно, следует освободить?


person adrianmcmenamin    schedule 09.11.2013    source источник


Ответы (1)


Проблема в линии -

   long int tid = strtol(threadID, &threadID, 16); //hex

Что обновляет значение threadID

Таким образом, когда попытка delete имеет место, это плохой указатель (т. е. он больше не указывает на нужное место в куче).

   long int tid = strtol(threadID, NULL, 16); //hex

Устраняет проблему. (Спасибо Альберто Массари за ответ).

person adrianmcmenamin    schedule 10.11.2013