我是个烂写java的,C++对我来说真是噩梦啊,有这么一段代码:char* data = new char[8];
recv(socket,data,8,0);
CString str = data;
或者 CString str(data);然后这个data该在哪里释放呢?
我在紧接着下面释放:
delete[] data;报错了。大家来救救我啊 谢谢!

解决方案 »

  1.   

    顺便问下问题2:
    CString getA(){
     CString a;
    return a;
    }main(){
    CString p = getA();
    这里能获得到p吗?a是不是在方法结束时就被释放了?
    }
      

  2.   

    这样写
    char* data = new char[9];
    memset(data,0,9);
    recv(socket,data,8,0);
    后面的不用改,要额外留一个字符给\0问题2:可以
      

  3.   

    楼上的大哥
    问题1中,您还是没告诉我char* 该在哪里释放啊。。
    问题2中, CString a是自动变量,应该在函数结束时释放掉了,为什么能返回呢。求详细解释。
      

  4.   

    CString str = data;
    或者 CString str(data);
    这两种方法都是对串进行的复制的,并不是CString直接就使用你分配的内存.
    所以你的释放是没有问题,只是在释放前你对data存在访问越界吧,提示的错误应该是堆被破坏之类的.对于类对象(结构体相同)的返回,会调用拷贝构造函数,实际上的操作是用你在函数里的对象a来构造了一个新对象p,然后a的生命周期到了,就被析构掉了.便于理解的话,你可以把对象a想像成一个整型变量 
      

  5.   

    这玩意一句两句很难说清楚,照2楼说的做,然后把你注释的那个DELETE放出来应该就好了..
      

  6.   

    我在CString str = data;
    后面调用delete[] data;
    内存出错了,如果这么简单我会大老远上论坛牢骚这么一句么?
      

  7.   

    完整代码如下:
    char *recvBuf = new char[8];    
    memset(recvBuf,0,9);
    int result = recv(sockClient,recvBuf,8,0);//前8位表示长度 
    if (result == 0){
    delete [] resultStr;
    delete [] recvBuf;
    return 0;
    }else if (result == -1){
    delete [] resultStr;
    delete [] recvBuf;
    CString error = _T("网络中断!");
    throw error;
    }else if (result!=8){
    delete [] resultStr;
    delete [] recvBuf;
    CString error=_T("返回值错误!");
    throw error;
    }
    CString dataLenStr(recvBuf);
    delete [] recvBuf;执行到最后那句时报错了。
    错误内容为:
    ---------------------------
    Microsoft Visual C++ Debug Library
    ---------------------------
    Debug Error!Program: ...cuments\Visual Studio 2010\Projects\××
    HEAP CORRUPTION DETECTED: after Normal block (#2445) at 0x005AB5C8.
    CRT detected that the application wrote to memory after end of heap buffer.
    (Press Retry to debug the application)
    ---------------------------
    中止(A)   重试(R)   忽略(I)   
    ---------------------------
      

  8.   

    看到HEAP CORRUPTION DETECTED基本可以肯定是这样了,请你看2楼的,是new9个字节,另外resultStr这东东不知道是啥
      

  9.   

    接收的数据最好不要转换为CString 来处理
    因为接收的数据中有可能是 0
    分配了 8个字节 char *recvBuf = new char[8]; 
    而你初始化memset(recvBuf,0,9); 9 个字节能不报错吗
    改为
    char *recvBuf = new char[9]; 
    另外
    CString dataLenStr(recvBuf);
     delete [] recvBuf;
    改为
    CString dataLenStr(recvBuf,8);
     delete [] recvBuf; 
      

  10.   

    bingo! 结帐! 欢迎大家再来解决我的初级问题哈。
      

  11.   

    你的问题不在于delete[]出错,而在于memset(recvBuf,0,9)出错了,你分配了8个字节的空间,却充了9个字节的值,最后释放时当然会出错。