读书人

好像是string的引用计数引起的0x00000

发布时间: 2012-08-28 12:37:01 作者: rapoo

好像是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();}; 


sky_data.h
C/C++ code
#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数组),};




[解决办法]
探讨
引用:

崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

原来还可以这么调试。。

[解决办法]
探讨
。。自己调试了3个小时了。。总是无缘无故的崩溃。
(在连接选项上加上 /force
代码:
http://kuai.xunlei.com/d/BUISTEGVVGQE

[解决办法]
你的那个工程是没有 printf_tree()这个函数调用的!!!

main 函数返回异常在这个 sky_data 类中!!

读书人网 >C++

热点推荐