这是ATL COM实现里的一个成员函数中的一个操作,简单实现在字符串中的每个'后再加个',但字符串大于2,3百K时会造成"OUT of stack space",谁能分析一下原因?
char *s=new char[1024*1024],*s3=s;
strcpy(s,W2A(m_OriginalText.m_str));
char *s1=new char[1024*1024],*s2=s1;
while(*s)

   *s1++=*s;
   if(*s++=='\'') 
   {
*s1++='\'';
   }

*s1='\0';
wcscpy(m_OriginalText,A2W(s2));
delete[] s3,s2;

解决方案 »

  1.   

    谢谢帮我UP,来人呀,就是不能完整解答,也帮我UP一下好么?谢谢了!
      

  2.   

    while(*s)

       *s1++=*s;
       if(*s++=='\'') ///at this moment, *s++ means *s,not *(s+1),so you probably have double size of results,since sizeof(s)=sizeof(s1) and include sizeof('),the occured error is common,i think.
       {
    *s1++='\'';
       }

      

  3.   

    你可以试试CMemFile,我开发DCOM就是用的这个,很好用,不过速度偏慢
      

  4.   

    sorry,your program havs no bug,i take back my words
      

  5.   

    To->aben456(风轻扬):谢谢了,再帮我想想.
    TO-> quengzi(code) :MoveMemory()是什么?
    TO->CMemFile:CMemFile知到没用过,你用CMemFile帮我写一下好么?
    TO->所有人:ATL里有这方面的限制么?
      

  6.   

    我看不出什么别的问题,但是你的代码有隐患:
    strcpy(s,W2A(m_OriginalText.m_str));
    这一句可能会造成越界,
    如果你不能确保W2A(...)的结果一定小于sizeof(s),
    或者不确保W2A(...)的结果有结束符。
      

  7.   

    cstring str = W2A(m_OriginalText.m_str);
    str.replace("'","''");
    wcscpy(m_OriginalText,A2W(str));
      

  8.   

    wcscpy(m_OriginalText,A2W(str));
    可能over flow
      

  9.   

    试试用stl吧,std::list<char>自己不用担心内存管理.
      

  10.   

    采取一个折中一点的办法吧先把你的字符串分割,不是说大于200到300K的时候出问题吗?
    那么就先把他分割成大小100K的
    然后在分别进行你的这个操作
    操作完成后char laststr[1024*1024];
    ZeroMemory(laststr,1024*1024);
    strcat(laststr,strpart1);
    strcat(laststr,strpart2);
    .................还有一点,你要确保laststr足够大
      

  11.   

    to->icansaymyabc(学习与进步):有道理,但我估计尚不会发生.
    TO->zheng_rui(第二刀) :我是ATL里
    TO->ZHENG017(风中王子):谢了,老朋友,但这是个需要解决的问题,实在不行我在用LIST
    TO-> snsins(不再信仰,不再坚持):看似笨办法,但值得一试,谢谢.
    TO->所有人:谁有在ATL里处理大字符串的经验,欢迎指教,谢谢.
      

  12.   

    原因是宏 W2A 和 A2W ,ATL里这两个宏是这样实现的:#define A2W(lpa) (\
    ((_lpa = lpa) == NULL) ? NULL : (\
    _convert = (lstrlenA(_lpa)+1),\
    ATLA2WHELPER((LPWSTR) alloca(_convert*2), _lpa, _convert)))#define W2A(lpw) (\
    ((_lpw = lpw) == NULL) ? NULL : (\
    _convert = (lstrlenW(_lpw)+1)*2,\
    ATLW2AHELPER((LPSTR) alloca(_convert), _lpw, _convert)))问题在于他们是通过调用 alloca 分配转换需要的临时内存块的!
    以下是MSDN中关于 alloca 的解释:Allocates memory on the stack.这样就能解释为何字符串达2~300k就会出现"OUT of stack space"了。
      

  13.   

    建议函数自己通过 new 或 alloc 在堆中分配足够大的内存块,然后调用:
    WideCharToMultiBytes 或 MultiBytesToWideChar,以下是 W2A, A2W 两个红调用的 Helper 函数在MFC中的实现:LPWSTR AFXAPI AfxA2WHelper(LPWSTR lpw, LPCSTR lpa, int nChars)
    {
    if (lpa == NULL)
    return NULL;
    ASSERT(lpw != NULL);
    // verify that no illegal character present
    // since lpw was allocated based on the size of lpa
    // don't worry about the number of chars
    lpw[0] = '\0';
    VERIFY(MultiByteToWideChar(CP_ACP, 0, lpa, -1, lpw, nChars));
    return lpw;
    }LPSTR AFXAPI AfxW2AHelper(LPSTR lpa, LPCWSTR lpw, int nChars)
    {
    if (lpw == NULL)
    return NULL;
    ASSERT(lpa != NULL);
    // verify that no illegal character present
    // since lpa was allocated based on the size of lpw
    // don't worry about the number of chars
    lpa[0] = '\0';
    VERIFY(WideCharToMultiByte(CP_ACP, 0, lpw, -1, lpa, nChars, NULL, NULL));
    return lpa;
    }
      

  14.   

    在VC7中的ATL 7.0 下已经解决了ATL 3.0 转换宏的问题了。你转移到VC7下吧,使用CW2A等。 没有这种问题。