Cstring对象=赋值时崩溃,望不吝赐教!

justin_duan 2013-09-06 09:41:07
谢谢各位看帖:
我写了一个Socket通信并显示在界面上的小程序,平时运行时没事,但是持续运行一段时间,一般是一两天左右,就会发生崩溃。用华生医生记录了崩溃信息以后,结果如下:
0159fecc 0057d11d 0000000a 0159ff28 00e4f070 justin!CFixedAlloc::Alloc+0x5d [fixalloc.cpp @ 78]
0159fedc 0057d284 0000000a 0000000a 0159ff28 justin!CString::AllocBuffer+0x27 [strcore.cpp @ 97]
0159feec 0057d3a3 0000000a 00da5ae4 0159ff28 justin!CString::AllocBeforeWrite+0x24 [strcore.cpp @ 200]
0159fefc 0057d432 0000000a 00da5ae4 00000034 justin!CString::AssignCopy+0xe [strcore.cpp @ 315]
0159ff10 00560e97 00da5ae4 71a22c6f 00e4f09e justin!CString::operator=+0x20 [strcore.cpp @ 346]
0159ff38 0056385b 00000000 0000ffff 00e4f108 justin!CMacsUDPSocket::OnSocketReceive+0x97
0159ff7c 0053dc3a 00e4f09e 0000ffff 0012f74c justin!CMACSAsyncSocket::SocketThreadProc+0x6b
0159ffb4 7c80b713 00e4f108 0000ffff 0012f74c justin!_beginthreadex+0xf4

代码中崩溃的语句只是简单的对cstring赋值的语句,还有几处类似的地方,都是这样对cstring对象赋值的崩溃,求指点迷津,到底崩溃的原因是什么
...全文
909 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
听音乐就好 2013-12-11
  • 打赏
  • 举报
回复
我这边是 WCHAR procPath[MAX_PATH]; GetModuleFileNameEx( hProcess , hModule, procPath, MAX_PATH); CString temp1 = proPath; CString temp2 = temp1;//出现崩溃 对字符数组最好初始化一下 WCHAR procPath[MAX_PATH] = {0}; 不知道和你那边是不是一样。。
baichi4141 2013-09-13
  • 打赏
  • 举报
回复
初步分析是你要操作的那几个CString在其他地方被错误修改了,可能是内存越界也可能是直接memcpy之类的,总之就是里面的关键信息是错的(例如记录当前申请内存长度的变量被覆盖了),结果导致赋值的时候“在赋值前清理现有内存申请新内存时”出现了异常
justin_duan 2013-09-13
  • 打赏
  • 举报
回复
感谢大家的回复。。。根据这几天的情况看,暂时还没有再次发生崩溃。 1.内存泄露用purify查过了,拷机也看过了,应该也是没有,至少是没有明显的内存泄露- - 2.回复中有提到是Cstring赋值内容的问题,这个有可能,但是有的崩溃是出现在类似 Cstring strName; strName = "WQ"; 这样的语句中的"="算符,我个人觉得可能和赋值的内容关系不大 3.现在来看,在多台电脑运行无异常,只有其中的两台存在这个崩溃问题,崩溃的时间也不一定,短则几小时,长则几天。 根据目前的情况我打算再好好走查一下代码,再检查一下内存以及数组的情况看看是否存在异常 再次感谢大家的回复
不死丁 2013-09-13
  • 打赏
  • 举报
回复
是不是编译时候开了优化
「已注销」 2013-09-12
  • 打赏
  • 举报
回复
未何一定要CString? 你觉得它可能有问题,你完全可以用char、wchar_t自己控制内存的申请和释放。
zhangyihu321 2013-09-12
  • 打赏
  • 举报
回复
5成是内存泄露 3成是DC泄露 剩下2成未知。。。 报告完毕
赵4老师 2013-09-10
  • 打赏
  • 举报
回复
//循环向a函数每次发送200个字节长度(这个是固定的)的buffer,
//a函数中需要将循环传进来的buffer,组成240字节(也是固定的)的新buffer进行处理,
//在处理的时候每次从新buffer中取两个字节打印
#ifdef WIN32
    #pragma warning(disable:4996)
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef WIN32
    #include <windows.h>
    #include <process.h>
    #include <io.h>
    #define  MYVOID             void
    #define  vsnprintf          _vsnprintf
#else
    #include <unistd.h>
    #include <sys/time.h>
    #include <pthread.h>
    #define  CRITICAL_SECTION   pthread_mutex_t
    #define  MYVOID             void *
#endif
//Log{
#define MAXLOGSIZE 20000000
#define MAXLINSIZE 16000
#include <time.h>
#include <sys/timeb.h>
#include <stdarg.h>
char logfilename1[]="MyLog1.log";
char logfilename2[]="MyLog2.log";
static char logstr[MAXLINSIZE+1];
char datestr[16];
char timestr[16];
char mss[4];
CRITICAL_SECTION cs_log;
FILE *flog;
#ifdef WIN32
void Lock(CRITICAL_SECTION *l) {
    EnterCriticalSection(l);
}
void Unlock(CRITICAL_SECTION *l) {
    LeaveCriticalSection(l);
}
void sleep_ms(int ms) {
    Sleep(ms);
}
#else
void Lock(CRITICAL_SECTION *l) {
    pthread_mutex_lock(l);
}
void Unlock(CRITICAL_SECTION *l) {
    pthread_mutex_unlock(l);
}
void sleep_ms(int ms) {
    usleep(ms*1000);
}
#endif
void LogV(const char *pszFmt,va_list argp) {
    struct tm *now;
    struct timeb tb;

    if (NULL==pszFmt||0==pszFmt[0]) return;
    vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);
    ftime(&tb);
    now=localtime(&tb.time);
    sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
    sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );
    sprintf(mss,"%03d",tb.millitm);
    printf("%s %s.%s %s",datestr,timestr,mss,logstr);
    flog=fopen(logfilename1,"a");
    if (NULL!=flog) {
        fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);
        if (ftell(flog)>MAXLOGSIZE) {
            fclose(flog);
            if (rename(logfilename1,logfilename2)) {
                remove(logfilename2);
                rename(logfilename1,logfilename2);
            }
        } else {
            fclose(flog);
        }
    }
}
void Log(const char *pszFmt,...) {
    va_list argp;

    Lock(&cs_log);
    va_start(argp,pszFmt);
    LogV(pszFmt,argp);
    va_end(argp);
    Unlock(&cs_log);
}
//Log}
#define ASIZE    200
#define BSIZE    240
#define CSIZE      2
char Abuf[ASIZE];
char Cbuf[CSIZE];
CRITICAL_SECTION cs_HEX ;
CRITICAL_SECTION cs_BBB ;
struct FIFO_BUFFER {
    int  head;
    int  tail;
    int  size;
    char data[BSIZE];
} BBB;
int No_Loop=0;
void HexDump(int cn,char *buf,int len) {
    int i,j,k;
    char binstr[80];

    Lock(&cs_HEX);
    for (i=0;i<len;i++) {
        if (0==(i%16)) {
            sprintf(binstr,"%03d %04x -",cn,i);
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        } else if (15==(i%16)) {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
            sprintf(binstr,"%s  ",binstr);
            for (j=i-15;j<=i;j++) {
                sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
            }
            Log("%s\n",binstr);
        } else {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        }
    }
    if (0!=(i%16)) {
        k=16-(i%16);
        for (j=0;j<k;j++) {
            sprintf(binstr,"%s   ",binstr);
        }
        sprintf(binstr,"%s  ",binstr);
        k=16-k;
        for (j=i-k;j<i;j++) {
            sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
        }
        Log("%s\n",binstr);
    }
    Unlock(&cs_HEX);
}
int GetFromRBuf(int cn,CRITICAL_SECTION *cs,FIFO_BUFFER *fbuf,char *buf,int len) {
    int lent,len1,len2;

    lent=0;
    Lock(cs);
    if (fbuf->size>=len) {
        lent=len;
        if (fbuf->head+lent>BSIZE) {
            len1=BSIZE-fbuf->head;
            memcpy(buf     ,fbuf->data+fbuf->head,len1);
            len2=lent-len1;
            memcpy(buf+len1,fbuf->data           ,len2);
            fbuf->head=len2;
        } else {
            memcpy(buf     ,fbuf->data+fbuf->head,lent);
            fbuf->head+=lent;
        }
        fbuf->size-=lent;
    }
    Unlock(cs);
    return lent;
}
MYVOID thdB(void *pcn) {
    char        *recv_buf;
    int          recv_nbytes;
    int          cn;
    int          wc;
    int          pb;

    cn=(int)pcn;
    Log("%03d thdB              thread begin...\n",cn);
    while (1) {
        sleep_ms(10);
        recv_buf=(char *)Cbuf;
        recv_nbytes=CSIZE;
        wc=0;
        while (1) {
            pb=GetFromRBuf(cn,&cs_BBB,&BBB,recv_buf,recv_nbytes);
            if (pb) {
                Log("%03d recv %d bytes\n",cn,pb);
                HexDump(cn,recv_buf,pb);
                sleep_ms(1);
            } else {
                sleep_ms(1000);
            }
            if (No_Loop) break;//
            wc++;
            if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);
        }
        if (No_Loop) break;//
    }
#ifndef WIN32
    pthread_exit(NULL);
#endif
}
int PutToRBuf(int cn,CRITICAL_SECTION *cs,FIFO_BUFFER *fbuf,char *buf,int len) {
    int lent,len1,len2;

    Lock(cs);
    lent=len;
    if (fbuf->size+lent>BSIZE) {
        lent=BSIZE-fbuf->size;
    }
    if (fbuf->tail+lent>BSIZE) {
        len1=BSIZE-fbuf->tail;
        memcpy(fbuf->data+fbuf->tail,buf     ,len1);
        len2=lent-len1;
        memcpy(fbuf->data           ,buf+len1,len2);
        fbuf->tail=len2;
    } else {
        memcpy(fbuf->data+fbuf->tail,buf     ,lent);
        fbuf->tail+=lent;
    }
    fbuf->size+=lent;
    Unlock(cs);
    return lent;
}
MYVOID thdA(void *pcn) {
    char        *send_buf;
    int          send_nbytes;
    int          cn;
    int          wc;
    int           a;
    int          pa;

    cn=(int)pcn;
    Log("%03d thdA              thread begin...\n",cn);
    a=0;
    while (1) {
        sleep_ms(100);
        memset(Abuf,a,ASIZE);
        a=(a+1)%256;
        if (16==a) {No_Loop=1;break;}//去掉这句可以让程序一直循环直到按Ctrl+C或Ctrl+Break或当前目录下存在文件No_Loop
        send_buf=(char *)Abuf;
        send_nbytes=ASIZE;
        Log("%03d sending %d bytes\n",cn,send_nbytes);
        HexDump(cn,send_buf,send_nbytes);
        wc=0;
        while (1) {
            pa=PutToRBuf(cn,&cs_BBB,&BBB,send_buf,send_nbytes);
            Log("%03d sent %d bytes\n",cn,pa);
            HexDump(cn,send_buf,pa);
            send_buf+=pa;
            send_nbytes-=pa;
            if (send_nbytes<=0) break;//
            sleep_ms(1000);
            if (No_Loop) break;//
            wc++;
            if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);
        }
        if (No_Loop) break;//
    }
#ifndef WIN32
    pthread_exit(NULL);
#endif
}
int main() {
#ifdef WIN32
    InitializeCriticalSection(&cs_log);
    InitializeCriticalSection(&cs_HEX );
    InitializeCriticalSection(&cs_BBB );
#else
    pthread_t threads[2];
    int threadsN;
    int rc;
    pthread_mutex_init(&cs_log,NULL);
    pthread_mutex_init(&cs_HEX,NULL);
    pthread_mutex_init(&cs_BBB,NULL);
#endif
    Log("Start===========================================================\n");

    BBB.head=0;
    BBB.tail=0;
    BBB.size=0;

#ifdef WIN32
    _beginthread((void(__cdecl *)(void *))thdA,0,(void *)1);
    _beginthread((void(__cdecl *)(void *))thdB,0,(void *)2);
#else
    threadsN=0;
    rc=pthread_create(&(threads[threadsN++]),NULL,thdA,(void *)1);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1);
    rc=pthread_create(&(threads[threadsN++]),NULL,thdB,(void *)2);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1);
#endif

    if (!access("No_Loop",0)) {
        remove("No_Loop");
        if (!access("No_Loop",0)) {
            No_Loop=1;
        }
    }
    while (1) {
        sleep_ms(1000);
        if (No_Loop) break;//
        if (!access("No_Loop",0)) {
            No_Loop=1;
        }
    }
    sleep_ms(3000);
    Log("End=============================================================\n");
#ifdef WIN32
    DeleteCriticalSection(&cs_BBB );
    DeleteCriticalSection(&cs_HEX );
    DeleteCriticalSection(&cs_log);
#else
    pthread_mutex_destroy(&cs_BBB);
    pthread_mutex_destroy(&cs_HEX);
    pthread_mutex_destroy(&cs_log);
#endif
    return 0;
}
oyljerry 2013-09-10
  • 打赏
  • 举报
回复
引用 7 楼 justin_duan 的回复:
感谢各位的回复,较多的提到了内存泄露的问题,根据我一个周末在多台电脑的拷机,在另外一台电脑上运行了两天,根据运行了两天的情况看,应该不是内存泄露,句柄泄露等问题。最后发现有两台电脑会有崩溃的问题,但是其他几台电脑暂时没事,内存也没有明显的增长。 拜托大家帮忙再想想还有什么可能吗,先谢谢各位了
你获取的是内容给CString是否合适。相加的时候可能处理有问题等
homesos 2013-09-10
  • 打赏
  • 举报
回复
可能是相加的内容有问题 在CMacsUDPSocket::OnSocketReceive中, CString +=运算前,打印一下,要+=的内容和长度,顺便打印一下CString的目前长度和内容。
justin_duan 2013-09-09
  • 打赏
  • 举报
回复
感谢各位的回复,较多的提到了内存泄露的问题,根据我一个周末在多台电脑的拷机,在另外一台电脑上运行了两天,根据运行了两天的情况看,应该不是内存泄露,句柄泄露等问题。最后发现有两台电脑会有崩溃的问题,但是其他几台电脑暂时没事,内存也没有明显的增长。 拜托大家帮忙再想想还有什么可能吗,先谢谢各位了
傻X 2013-09-06
  • 打赏
  • 举报
回复
遇到过类似情况,最后是字节对齐等问题。不过楼主运行了一段时间了,估计还是内存泄露的可能性比较大。。可以用CheckBounds查查看,不推荐VLD,那东西太烂。
fronz 2013-09-06
  • 打赏
  • 举报
回复
看你怎么赋值的,栈上或堆上,用指针的话,是否释放过。
yaozhiyong110 2013-09-06
  • 打赏
  • 举报
回复
那只是表象 根本原因要不就是你CString用错了 要不就是内存泄露了...
zgl7903 2013-09-06
  • 打赏
  • 举报
回复
看看内存的增长情况,是不是内存有泄漏 导致内存耗尽了
  • 打赏
  • 举报
回复
这种情况通常是某些地方越界了造成的,不会是CString的问题
猪八戒照镜子 2013-09-06
  • 打赏
  • 举报
回复
貌似我也有出现过。。 CMap里放CArray,CArray放CString。 后来移除的时候就出现CString释放错误什么的。。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧