好像是string的引用计数引起的0x0000005异常,哪位高手来调教一上
好像是string的引用计数引起的0x0000005错误,谁来调教一下
在sky_data 读取完成数据以后,
使用printf_tree(ostream&,sky_data*)写入数据的时候会出现这个错误:
根据注释,因该是多线程退出导致的引用计数错误。
但是一直找不到错在哪里。求调教高手来调教一下
printf_tree 源码:
平台:VS2008
源代码:xml_read(已经实现,如果有错的话就是输入的文件出错)
_str_.h (一个自己写的专门对string做处理的函数集合,经过调试,也没有逻辑错误utf_8_ansi就是指把utf8编码转换成ANSI编码
sky_data,一个专门对xml_read进行进一步分析的类,整个类构造完成以后就会把所有的数据以树的方式保存起来
利用了多线程(新人昨天刚刚学多线程,估计就是这里错了,但是找不到原因)
down.h:下载某一个文件
string_buffer 自己写的一个类似缓存的结构(渣技术,渣检错,不知道是不是这里出了问题)
xml_read.h
在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(); };