我是个烂写java的,C++对我来说真是噩梦啊,有这么一段代码:char* data = new char[8];
recv(socket,data,8,0);
CString str = data;
或者 CString str(data);然后这个data该在哪里释放呢?
我在紧接着下面释放:
delete[] data;报错了。大家来救救我啊 谢谢!
recv(socket,data,8,0);
CString str = data;
或者 CString str(data);然后这个data该在哪里释放呢?
我在紧接着下面释放:
delete[] data;报错了。大家来救救我啊 谢谢!
CString getA(){
CString a;
return a;
}main(){
CString p = getA();
这里能获得到p吗?a是不是在方法结束时就被释放了?
}
char* data = new char[9];
memset(data,0,9);
recv(socket,data,8,0);
后面的不用改,要额外留一个字符给\0问题2:可以
问题1中,您还是没告诉我char* 该在哪里释放啊。。
问题2中, CString a是自动变量,应该在函数结束时释放掉了,为什么能返回呢。求详细解释。
或者 CString str(data);
这两种方法都是对串进行的复制的,并不是CString直接就使用你分配的内存.
所以你的释放是没有问题,只是在释放前你对data存在访问越界吧,提示的错误应该是堆被破坏之类的.对于类对象(结构体相同)的返回,会调用拷贝构造函数,实际上的操作是用你在函数里的对象a来构造了一个新对象p,然后a的生命周期到了,就被析构掉了.便于理解的话,你可以把对象a想像成一个整型变量
后面调用delete[] data;
内存出错了,如果这么简单我会大老远上论坛牢骚这么一句么?
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)
---------------------------
因为接收的数据中有可能是 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;