2011-12-28 3 views
2

속성의 메모리 및 rapidXML로 어떤 일이 일어나는지 이해하지 못합니다. 함수는 XML 파싱을 캡슐화합니다 (성공하면 루트 노드에 대한 참조를 반환 함).이 함수 내에서 트래버스 DOM 트리를 호출 할 때 xml 파일에 올바른 데이터가 저장됩니다.rapidXML, DOM 트리를 가로 지르는 동안 메모리가 손상됨

typedef rapidxml::xml_node<>* Node; 
... 
Node Load() 
{ 
    Node pRootNode = NULL; 
    // read file stream in bytes 
    ... 
    std::vector<char> xmlCopy(bytes.begin(), bytes.end()); 
    xmlCopy.push_back('\0'); 
    rapidxml::xml_document<> doc; 

    try 
    { 
     doc.parse<rapidxml::parse_declaration_node | rapidxml::parse_no_data_nodes>(&bytes[0]); 
     pRootNode = doc.first_node(); 
      ... 
      TraverseDOMTree(pRootNode); 
    } 
    return pRootNode; 
} 

TraverseDOMTree는 모든 속성과 노드 이름을 예상대로 인쇄합니다.

나중에로드의 범위를 벗어나면 pRootNode가 DOM 3의 값을 쿼리하는 데 사용되지만 이는 작동하지 않습니다. 완벽하게 작동하는 TraverseDOMTree를 호출하는 테스트 용으로 이제 특성의 가비지 값을 인쇄합니다. 나는 DOM 트리가 여전히 존재한다고 가정 할 수있다. 첫 번째 호출에서와 같은 노드 계층 구조이지만 속성 값은 엉망이다. rapidxml :: xml_document <> doc을 글로벌로 만들려고 시도했으며 parse_non_destructive 플래그를 추가했지만 차이가 없습니다.

중요한 점은 Load 메서드를 사용하는 클라이언트가 동일한 스레드에서 실행되고 있다는 것입니다. 무엇이 잘못 될 수 있습니까?

답변

3
std::vector<char> xmlCopy(bytes.begin(), bytes.end()); 

XML 문서의 일련의 표현은 로컬 복사본입니다. 나는 rapidXML이 속성의 사본을 만들지 않을 것이지만, 순서에 대한 포인터를 사용한다고 생각한다. 속성 값의 주소와 문서 사본을 보면 확인할 수 있습니다.

+0

하지만 나는 영구적 인 의사를 만들려고 노력했지만 작동하지 않았습니다. 최소한 그것이 포함 된 클래스가 파괴되지 않을 때까지 지속될 것입니다. 이것은 정확히 무엇을하고 있는지, 내가 이해할 수있는 한 정확하지만, 아직 다른 잘못된 것이 있습니다. 또한 의사가 클리어/클린/리셋 메소드를 가지고 있는지를 확인하는 것이 유용 할 것입니다. – notNullGothik

+0

맞습니다. 감사! – notNullGothik

+0

이 답변으로 정말 저를 구해 줬습니다. 감사합니다! 문자열과 문서에 대한 참조를 취한 함수가 있었고 구문 분석 함수로 참조를 변경했습니다. 문제는 신속하게 범위를 벗어난 로컬 문자열로 구문 분석되었습니다. 나중에 문서를 탐색하는 동안 문자열이 메모리에서 최종적으로 덮어 쓰여지는 경우 실수로 실패합니다. –

관련 문제