好像是string的引用计数引起的0x0000005异常,哪位高手来调教一上

好像是string的引用计数引起的0x0000005错误,谁来调教一下
在sky_data 读取完成数据以后,
使用printf_tree(ostream&,sky_data*)写入数据的时候会出现这个错误:

根据注释,因该是多线程退出导致的引用计数错误。
但是一直找不到错在哪里。求调教高手来调教一下
printf_tree 源码:
C/C++ code
void printf_tree(std::ostream& icout,sky_data* point)
{
    if(point==NULL)

    icout<<point->_tree_hard.id<<endl;
    icout<<point->_tree_hard.item_name<<endl;
    icout<<point->_tree_hard.last_dir<<endl;
    icout<<"__________________________________________________"<<endl;    
    map<string,item>::iterator iter=point->img_item.begin();
    while(iter!=point->img_item.end())
    {
        icout<<iter->second.id<<endl;
        icout<<iter->second.item_name.c_str()<<endl;
        icout<<endl;
        ++iter;
    }

    iter=point->doc_item.begin();
    while(iter!=point->doc_item.end())
    {
        icout<<iter->second.id<<endl;
        icout<<iter->second.item_name.c_str()<<endl;;
        icout<<endl;
        ++iter;
    }
    

    icout<<"___________________________________________________"<<endl;

    if(point->tree.empty())
    return;
    map<string,sky_data*>::iterator i_tree=point->tree.begin();
    while(i_tree!=point->tree.end())
    {

    printf_tree(icout,i_tree->second);
    ++i_tree;
    }

}


平台:VS2008
源代码:xml_read(已经实现,如果有错的话就是输入的文件出错)

_str_.h (一个自己写的专门对string做处理的函数集合,经过调试,也没有逻辑错误utf_8_ansi就是指把utf8编码转换成ANSI编码
sky_data,一个专门对xml_read进行进一步分析的类,整个类构造完成以后就会把所有的数据以树的方式保存起来
利用了多线程(新人昨天刚刚学多线程,估计就是这里错了,但是找不到原因)
down.h:下载某一个文件
string_buffer 自己写的一个类似缓存的结构(渣技术,渣检错,不知道是不是这里出了问题)



xml_read.h
C/C++ code

#pragma once
#include "stdafx.h"
#include<string>
#include<vector>
#include<map>
#include<fstream>
#include"_str_.h"

unsigned int DIR=0;
unsigned int PHOTO=1;
unsigned int DOC=2;
std::string INDEX="index_dir";

struct FLAG
{
    std::string start;
    std::string end;
};

FLAG DIR_FLAG={"<Folder>","</Forlder>"};
FLAG DIR_NAME={"<Name>","</Name>"};
FLAG PHOTO_FLAG={"<Photo>","</Photo>"};
FLAG DOC_FLAG={"<Document>","</Document>"};


FLAG ITEM_TYPE={"<ItemType>","</ItemType>"};
FLAG RES_ID={"<ResourceID>","</ResourceID>"};
FLAG ITEM_NAME={"<RelationshipName>","</RelationshipName>"};

FLAG* make_flag(std::string start,std::string end)
{
    FLAG* ret=new FLAG;
    ret->start=start;
    ret->end=end;
    return ret;

}


struct item
{
    std::string last_dir;
    unsigned int flag;
    std::string id;
    std::string item_name;
    bool operator ==(const item&);
};

item* make_item(unsigned int flag,std::string id,std::string item_name,std::string b_dir)
{
    item* ret=new item;
    ret->last_dir=b_dir;
    ret->flag=flag;
    ret->id=id;
    ret->item_name=item_name;
    return ret;
}

bool item::operator ==(const item& _item)
{
    if(last_dir==_item.last_dir)
        if(flag==_item.flag)
            if(id==_item.id)
                if(item_name==_item.item_name)
                    return true;
    return false;
}

class xml_read
{
public:
    xml_read(std::string,std::string);
private:
    std::vector<item> Doc_id_name;
    std::vector<item> Dir_id_name;
    std::vector<item> Img_id_name;
    std::string xml_file;
    item* xml_information;

private:
    void load_xml_hard(std::string,std::string);
    item read_item(std::string,std::string);
    bool is_dir_id(std::string);
    unsigned int what_flag(std::string);
    
public:
    std::vector<item>& Get_Doc_Id_Name(){return Doc_id_name;}
    std::vector<item>& Get_Dir_Id_Name(){return Dir_id_name;}
    std::vector<item>& Get_Img_ID_Name(){return Img_id_name;}
    void reload_xml(std::string,std::string);
    item Get_this();
};