好像是string的引用计数引起的0x0000005错误,谁来调教一下
在sky_data 读取完成数据以后,
使用printf_tree(ostream&,sky_data*)写入数据的时候会出现这个错误:
根据注释,因该是多线程退出导致的引用计数错误。
但是一直找不到错在哪里。求调教高手来调教一下
printf_tree 源码:
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; }}#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();};
#pragma once#include<map>//#include<pair>#include<vector>#include<string>#include"xml_read.h"#include"down.h"#include<windows.h>std::ofstream error_log;struct DownMessage{ DownMessage(std::string link,string_buffer* buffer):link(link),buffer(buffer) { } std::string link; string_buffer* buffer;};/*struct tree_message{ tree_message( DownMessage* down, item* _data):down_message(down),_data(_data) {} DownMessage* down_message; item* _data;};*/class sky_data;struct use_data{ use_data(sky_data* _tree,void* parment):_tree(_tree),parment(parment) {} sky_data* _tree; void* parment;};DownMessage make_down(std::string link,string_buffer* buffer){ DownMessage ret(link,buffer); return ret;}/*tree_message make_message(DownMessage* down,item* _data){ tree_message ret(down,_data); return ret;}*/use_data make_use_data(sky_data* _tree,void* parment){ use_data temp(_tree,parment); return temp;}class sky_data{public: sky_data(xml_read&); ~sky_data(void); sky_data();public: std::map<std::string,item> doc_item; std::map<std::string,item> img_item; std::map<std::string,item> Dir_item; std::map<std::string,sky_data*> tree; item _tree_hard; //void file_make(xml_read&); //bool read_xml_path(std::string);public: //void Bind_Xml(xml_read*); //bool save_xml_path();private: xml_read* data; std::map<std::string,string_buffer*> xml_buffer;public: //void Updata(item*); //void Updata_all();private: std::string down_xml(std::string,string_buffer*); //void down_xml(DownMessage*);public: std::map<std::string,std::string> xml_path;public: //void read_dir_url(item*);private: //void make_tree(); //void append_tree(std::pair<std::string,sky_data*>*);public: friend unsigned int __stdcall _xml_read(void*);//从string中读取一个xml_read 参数:调用它的sky_data*,string* //friend unsigned int __stdcall _read_cache(void*);//从一个文本里读取保存的缓存 参数:调用它的sky_data*,string*(文件路径) // unsigned int __stdcall _read_dir(void*);//批量读取文件夹信息,当所有的文件夹读取完毕后才返回 参数:调用它的sky_data*, //friend unsigned int __stdcall _Updata(void*);//刷新一个文件夹 参数:调用它的sky_data*,item* (要刷新的文件夹的信息) //friend unsigned int __stdcall _Updata_all(void*);//刷新整个sky_data 参数:调用它的sky_data* (相当于重新装载) //friend unsigned int __stdcall _save_cache(void*);//保存文件的缓存,此线程在主线程结束后依然存在,直到所有缓存保存完毕 参数:std::map<std::string,string_buffer*> 的副本 friend unsigned int __stdcall _copy_data(void*);//从xml_read复制img,dir这两个信息,参数:调用它的sky_data*,xml_read* unsigned int _wait(HANDLE*,unsigned long);//等待某一个线程的结束,参数:指定线程的handle(可以是handle数组),};