0

長い間グーグルを作った後も、有効なパラメータでxmlReaderForMemoryがクラッシュする理由/解決策を見つけることができません。

libxmlを使用して2つのパーサー関数を作成しましたが、個別に呼び出すと正常に機能しますが、次々に呼び出すと、次のエラーが発生してxmlReaderForMemoryでクラッシュします。

nayak.exeの0x7c918feaでのファーストチャンス例外:0xC0000005:アクセス違反の書き込み場所0x00000010。nayak.exeの0x7c918feaで未処理の例外:0xC0000005:アクセス違反の書き込み場所0x00000010。

今私は2つの関数のコードを与えています:

最初の機能:

 char* CB_omniParser(char *omnistring){

        char *parseResult,;
        const char *fileName = omnistring;   
        char *temp,*texttemp,*result=0; 
        int i,len=0,error;
        xmlTextReaderPtr reader;
        len= strlen(omnistring);
        if(len==0)
                    return 0;   
                reader = xmlReaderForMemory(fileName,len,"",NULL,0);    

        if(reader){

            temp = (char *) GlobalAlloc(GPTR, sizeof(char)*len);
            parseResult = (char *) GlobalAlloc(GPTR,sizeof(char)*len+1);
            while(error=xmlTextReaderRead(reader)) {
                if(error==-1){              
                    return 0; // on failure
                }           
                switch(xmlTextReaderNodeType(reader)) {

                    case XML_READER_TYPE_ELEMENT: 

                        temp = (char *)xmlTextReaderConstName(reader);
                            strcat(parseResult,temp);                   
                            strcat(parseResult,"#");                            

                        xmlTextReaderMoveToElement(reader);                     
                          continue;

                    case XML_READER_TYPE_TEXT:  
                        temp = (char *)xmlTextReaderConstValue(reader); 
                                strcat(parseResult,temp);                           
                                strcat(parseResult,"|");                

                        continue;               

                }   

            }

            xmlFreeTextReader(reader);
            xmlCleanupParser();
            return parseResult;//on success returns the parsed omni string
        }
        else
            return 0; // on failure
    }

2番目の機能:

   char* CB_xmlParserFromMemory(char *xmlstring){
        char *xmlParseresult;   
        char *temp; 
        int i,len,,error;;

        xmlTextReaderPtr reader1;

        len= strlen(xmlstring);
        if(len==0)
            return 0;
        reader1 = xmlReaderForMemory(xmlstring,len,NULL,NULL,0);


        if(reader1){

            temp = (char *) GlobalAlloc(GPTR, sizeof(char)*len);
            while(error=xmlTextReaderRead(reader1)) {

                if(error==-1){
                    return 0; // on failure
                }           
                switch(xmlTextReaderNodeType(reader1)) {

                    case XML_READER_TYPE_ELEMENT: 

                        temp = (char *)xmlTextReaderConstName(reader1);                 

                            strcat(xmlParseresult,"\"");
                            strcat(xmlParseresult,temp);
                            strcat(xmlParseresult,"\"");
                            strcat(xmlParseresult,":");

                        xmlTextReaderMoveToElement(reader1);     
                          continue;

                    case XML_READER_TYPE_TEXT:              

                        temp = (char *)xmlTextReaderConstValue(reader1); 
                        strcat(xmlParseresult,"\"");
                        strcat(xmlParseresult,temp);
                        strcat(xmlParseresult,"\"");
                        strcat(xmlParseresult,",");
                    continue;               

                }   

            }       
            xmlCleanupParser();     
            xmlFreeTextReader(reader1);     
            GlobalFree(temp);
            return xmlParseresult;//on success returns the parsed omni string   
        }
        else
            return 0; // on failure
    }

両方の関数は個別に正常に機能していますが、次々に関数を呼び出すと、上記の場所で両方がクラッシュします...同じエラー..plzが役に立ちます.....

4

1 に答える 1

0

自分の質問に答える機会があるので、私にとっては幸運な日だと思います...

今、私はそれが問題なく私の最後に完全にうまく機能しているので幸せです、問題は記憶の問題でした(それはそうではありません、あなたが記憶の問題という言葉を聞いた後にあなたが考えていることです)。

この問題は、次のステートメントのために提起されていました。

     xmlCleanupParser();

私が代わりに使用したように

   xmlInitParser ();

しかし、あなたたちもいくつかの仕事をする必要があるので、今私は理由を与えません...

これから抜け出すのに役立ったURLをお伝えします。

于 2012-05-25T05:04:47.297 に答える