我想把 CMapStringToString data 的数据拷贝添加到 类的数据成员 m_data, 但是运行时就出下面这个错误.到底什么地方出错?First-chance exception at 0x102320a0 (msvcr80d.dll) in tests.exe: 0xC0000005: Access violation reading location 0x0111fffc.
Unhandled exception at 0x102320a0 (msvcr80d.dll) in tests.exe: 0xC0000005: Access violation reading location 0x0111fffc.
class mydata
{
public:
CList<CMapStringToString*,CMapStringToString*>* m_data;
public:
bool AddData(CMapStringToString& data);
bool ValidateData(CMapStringToString& data);
};bool mydata::AddData(CMapStringToString& data)
{
CString* key;
CString* value;
if(this->ValidateData(data)){
CMapStringToString* rowdata=new CMapStringToString();
POSITION pos=data.GetStartPosition();
while(pos!=NULL){
key =new CString(_T(""));
value=new CString(_T(""));
data.GetNextAssoc(pos,*key,*value);
rowdata->SetAt(*key,*value);
}
m_data->AddTail(rowdata);
return true;
}
return false;
}

解决方案 »

  1.   

    m_data在AddTail之前哪里有赋值?没看到
      

  2.   

    在构造函数里 初始化的 
    m_data=new CList<CMapStringToString*,CMapStringToString*>();刚调试的时候发现,问题出在,下面这段代码的第二次循环,但是不知道问题出在哪里        while(pos!=NULL){
                key =new CString(_T(""));
                value=new CString(_T(""));
                data.GetNextAssoc(pos,*key,*value);
                rowdata->SetAt(*key,*value);
            }
      

  3.   

    指针不要滥用,比如你这个m_data完全不应该用指针;key、value两个变量也不应该用指针。
      

  4.   

    //这错: CList<CMapStringToString*,CMapStringToString*>* m_data;
                   数据类型              数据描述               数据列表(不得再为指针)
    //Copy :清洗?容量序号?是否为同一数据类形?实列,引用,指针
      

  5.   

    CList<CMapStringToString*,CMapStringToString*>* m_data; 错误,你声明,根本没有定义
    之后你就AddTail ,数据没有地方存放!解决方法:
     一、new 一个CList<CMapStringToString*,CMapStringToString*>*对象,然后赋值给 m_data
    或者二、直接定义CList<CMapStringToString*,CMapStringToString*>m_data
      

  6.   

    给你写stl的写法,比较安全的,未经测试,可能会有语法错误#include <hash_map>
    #include <list>
    using namespace stdext;
    using namespace std;
    typedef hash_map<string,string> datamap;
    typedef list<datamap> datalist;
    class mydata
    {
    public:
      datalist m_data;
    public:
      bool adddata(datamap& data);
      bool validatedata(const datamap & data);
    }
    bool mydata::adddata(datamap& data)
    {
      if(!validatedata(data))
        return false;
      //由于hash_map已经有缺省数据拷贝,所以不用new,直接push_back即可
      m_data.push_back(data);
      return true;
    }
      

  7.   

    谢谢大家的建议,调试后显示问题是出在第二次运行 data.GetNextAssoc(pos,key,value);时, 但我不知道如何修改这个地方.
            CString key;
            CString value;
            while(pos!=NULL){
                data.GetNextAssoc(pos,key,value);
                rowdata->SetAt(key,value);
            }