vector<CString>  不知道 这样的写法好不好。 有没有这么写的, 我在 用  vector<CString> 的时候 。在 程序关闭时出现了一个问题。提示是下面这样"tstcon32.exe 中的 0x10057816 (CurveChart.ocx) 处未处理的异常: 0xC0000005: 读取位置 0x01b87038 时发生访问冲突 。"中断指向: size_type size() const
{ // return length of sequence
return (_Myfirst == 0 ? 0 : _Mylast - _Myfirst);
}
 我现在需要把很多个 字符串存起来。不知道有什么好办法。

解决方案 »

  1.   

    vector <CString&> 可以吗?
      

  2.   

    或者vector <CString*> 
      

  3.   

    val = "1247715000|1619$$1247715300|1592$$1247715600|1787$$1247715900|1622$$1247716200|1499$$^^$^^1247715000|1319$$1247715300|1392$$1247715600|1387$$1247715900|1622$$1247716200|1399$$";vector<string>  m_vecStr;
    m_vecStr.push_back( val );CString str = m_vecStr[ m_vecStr.size() - 1 ];
    m_vecStr.erase( m_vecStr.begin() + m_vecStr.size() - 1 );
      

  4.   


    应该是
    vector <CString>  m_vecStr; 
    回spring203, 我没有像你说的那样写。不知道是怎么实现的 
      

  5.   

    size_type size() const
    { // return length of sequence
    return (_Myfirst == 0 ? 0 : _Mylast - _Myfirst);
    }
    这个你直接用:m_vecStr.size()
    不就行了吗?
      

  6.   

    你的用法错了吧
    你只是加了一个字符串进去,所以你的数组大小也就是1(你是字符串数组,不是字符数组)
    m_vecStr.size() - 1 是个大于1的数,这样就如同
    int a[1] = {1};
    int b = a[20];
      

  7.   


    如果只加一个字符串的话。
    m_vecStr.size() - 1 = 0.。   这个我确定。 问题不是出在这里
      

  8.   

    vector<CString*> vectorID;
    CString * pStr=new CString(100);pStr = "AAA";
    vectorID.push_back(pStr);
    delete[] pStr;指针是这么写吗?有错误 
      

  9.   


    用完再delete吧?我觉得不要用new和引用最好。
      

  10.   

    STL里面可以直接使用CString,但这时再不能对各对象使用memcpy直接Copy了
    感觉你的问题出在这一句:
    m_vecStr.erase( m_vecStr.begin() + m_vecStr.size() - 1 );
    当Size等于0时,就是这个样子了:
    m_vecStr.erase( m_vecStr.begin() + 0 - 1 );
    其实,这时候m_vecStr.begin()等于m_vecStr.end(),也就是
    m_vecStr.erase( m_vecStr.end() + 0 - 1 );
      

  11.   

    rspider2003 你好。 问题不是出在这里。  
    我有这个限制if ( m_vecStr.size()!= 0 )
    {
    vector <CString>  m_vecStr; 
    m_vecStr.push_back( val ); CString str = m_vecStr[ m_vecStr.size() - 1 ]; 
    m_vecStr.erase( m_vecStr.begin() + m_vecStr.size() - 1 );
    }
      

  12.   

    到底哪行出错?
    CString str = m_vecStr[ m_vecStr.size() - 1 ];
    还是
    m_vecStr.erase( m_vecStr.begin() + m_vecStr.size() - 1 );
      

  13.   


    这样用vector <string>  m_vecStr;
    m_vecStr.push_back( val );
    CString str;
    if(!m_vecStr.empty())
    {
    str = m_vecStr.pop_back();
    }在还不确定容器是否有数据就从容器中取数据简直是自杀。另外还需要确定取得下标在不在容器里
      

  14.   

    vector<CString>这样定义没有问题,用起来应该也没问题。。如果有问题应该是使用vector导致的。
      

  15.   

    还不如直接用 CStringArray 呢
      

  16.   

    既然用了MFC的类CString那就不如都用MFC的类,如楼上说的CStringArray 或者CPtrArray
      

  17.   

    谢谢大家的帮助。  我是在ActiveX中用的。 我发现我用 vector<CString>. list<CString>.  和  CStringArray  都会出现同样的问题。我对vector的操作是比较熟练的。 一般不会出现 低级错误 。所以大家最好不要在 低级错误上 猜想。
    "tstcon32.exe 中的 0x10057816 (CurveChart.ocx) 处未处理的异常: 0xC0000005: 读取位置 0x01b87038 时发生访问冲突 。" 
      

  18.   

    27楼正解!
    vector是用SDK编程时期的产物,和CString一起使用不仅看起来别扭,风格不统一,也有可能存在潜在问题.既然是用MFC,就都用MFC这一套库,搭配起来肯定没有问题.
      

  19.   

    建议用27楼的CStringArray 或者CPtrArray
      

  20.   


    vector是用SDK编程时期的产物????
      

  21.   

    楼上误解了.vector是STL的内容,基本上C++编程都能使用,我所强调的是编程风格的问题.不必故意曲解.
      

  22.   


    if ( m_vecStr.size()!= 0 )
    {
    vector <CString>  m_vecStr; // 你确认这行没错吗?
    m_vecStr.push_back( val );CString str = m_vecStr[ m_vecStr.size() - 1 ];
    m_vecStr.erase( m_vecStr.begin() + m_vecStr.size() - 1 );
    }
      

  23.   

    顶楼上的,用法有严重问题,声明是CString类的,但是m_vecStr.push_back( val );
    存进去的是一个指针地址,请问
    void push_back(
       const Type& _Val
    );
    引用进去的是一个栈上地址val的,它的值是字串常指针,
    所以你应该声明为vector < TCHAR *> m_vecStr;
      

  24.   

    还有,你的val都是在栈上建的,只能在一个函数范围内使用,退出就失效
      

  25.   

    是你的m_vecstr栈上建的,说错一个呵呵,m_vecstr最好是声明在类成员,不然就只能在一个函数范围内使用
      

  26.   

    既然用了STL,那么要删除最后一个元素就用回其对应的最简便的操作啊, 好象记得有23楼soliddream66说的.popback这个东西.  另外既然用了 .begin, .end, 表示你已经在用迭代器啊, 那为什么不老老实实定义个 iterator:: xxx= xx.begin() 这样用呢?  印象中(也可能记错了) .erase这种东西 在把()里 的迭代器所指的内容删除后, 会把这个迭代器指向下一个元素.  如果.erase()里面都没个变量, 估计问题就出在这.  我认为STL里的东西, 老老实实按规矩用是不会出错的. 
      

  27.   

    既然用了STL,那么要删除最后一个元素就用回其对应的最简便的操作啊, 好象记得有23楼soliddream66说的.popback这个东西.  另外既然用了 .begin, .end, 表示你已经在用迭代器啊, 那为什么不老老实实定义个 iterator:: xxx= xx.begin() 这样用呢?  印象中(也可能记错了) .erase这种东西 在把()里 的迭代器所指的内容删除后, 会把这个迭代器指向下一个元素.  如果.erase()里面都没个变量, 估计问题就出在这.  我认为STL里的东西, 老老实实按规矩用是不会出错的. 
      

  28.   

    总结: 谢谢上面的一些 建议。对我很有帮助。 我用 vector也是 挺熟练的。我认为我的在做法上应该没错。以前都是这么用的。  也许用的不太规范吧。但好像是没有错的.我在程序中 用 vector,list,CStringArray都出错。   楼上你好。 我是 删除vector中第一个元素的。不是最前面那个。 所以应该用
    m_vecStr.erase( m_vecStr.begin() + m_vecStr.size() - 1 );而不是用
    m_vecStr.pop_back();我认为主要问题应该在 线程上。我是在一个线程里对vector的。   我现在不用线程了。用 同样的方法操作 vector或者是 list. 现在不出错了。 但是只有一个线程在用  vector代码如下DWORD WINAPI RecvData(LPVOID pParam)

    CCurveChartCtrl *p = (CCurveChartCtrl *)pParam;
    while (true)
    {
    p->GetDisplayData();//这里操作vector
    Sleep( 1 );
    }
    return 0;
    }
    所以我又觉得用法应该没问题。    我现在真不知道问题到底出在哪了。   
      

  29.   

    void main(void)
    {
      std::vector<CString> vtVal;
      {
        CString szVal("111111");  
        vtVal.push_back(szVal);
      } //程序执行到这里szVal生存周期结束 szVal将执行析构操作释放资源
      //vtVal的0号资源已释放故而vtVal[0]是一个未知内存块。
      
    }
      

  30.   

    to 楼上:
     我觉得不是你说的这样的。 szVal是析构了。但是 已经把 szVal所指向的内容 放入vector中了。szVal所指向的内容 是放到 vector的备用空间中的。 szVal释放与否无所谓
      

  31.   

    或者这样来做 vtVal.push_back("111111");  。 这回不会有问题了吧? 其实和你的做法 是一样的
      

  32.   

    说一下。 sndashixi和 sndaxdrs是同一个人。 登错号了
      

  33.   

    vector<CString>本身不会有什么问题,如果出问题,应该是你自己代码的问题。
    vector都用上了,干粹vector<string>或vector<wstring>算了。
    要么你就用CStringArray。
      

  34.   

    在我的VC2005里面没啥问题啊:#include <afx.h>
    #include <vector>
    #include <iostream>using namespace std;int main() {
    vector<CString> v;
    v.push_back("abc");
    v.erase(v.begin() + v.size() - 1);
    cout << v.size() << endl;
    return 0;
    }
      

  35.   

    既然用了CString,就直接用CStringArray吧。
      

  36.   

    谢谢大家的建议。以后就用 CStringArray或者CStringList了。 以前还真不知道有这两个类。vector<CString>感觉怪怪的。   谢谢大家。结贴