先来一段程序:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string.h>
using namespace std;
int getMem(char* &p) {
int ret = 0;
if (&p == NULL) {
cout << "func getMem &p == NULL err: " << ret << endl;
return ret;
}
p = (char*)malloc(100 * sizeof(char));
if (p == NULL) {
ret = -2;
cout << "func getMen p == NULL err: " << ret << endl;
return ret;
}
cout << strlen(p) << endl;
memset(p, 0, 100);
strcpy(p, "hello world");
return 0;
}
void freeMem(char* &p) {
if (p)
free(p);
p = NULL;
}
int main() {
int ret = 0;
char* p = NULL;
ret = getMem(p);
if (ret != 0) {
cout << "func getMem() failed" << endl;
return ret;
}
cout << p << endl;
freeMem(p);
system("pause");
return 0;
}
输出结果:
这段程序是我调试后没有错误的。出错的是下面这段
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string.h>
using namespace std;
int getMem(char* &p) {
int ret = 0;
if (&p == NULL) {
cout << "func getMem &p == NULL err: " << ret << endl;
return ret;
}
p = (char*)malloc(100 * sizeof(char));
if (p == NULL) {
ret = -2;
cout << "func getMen p == NULL err: " << ret << endl;
return ret;
}
//cout << strlen(p) << endl;
memset(p, 0, strlen(p));
strcpy(p, "hello world");
return 0;
}
void freeMem(char* &p) {
if (p)
free(p);
p = NULL;
}
int main() {
int ret = 0;
char* p = NULL;
ret = getMem(p);
if (ret != 0) {
cout << "func getMem() failed" << endl;
return ret;
}
cout << p << endl;
freeMem(p);
system("pause");
return 0;
}
开始一直出现断点,
调试后发现在释放内存时出错,释放内存出错多半都是分配内存时出错,但又显然不是内存空间分配的不够,我查看了内存分配的情况:
这显然不是内存少了,而是多了,莫名的多了13个字节的空间,我去掉memset内存清空操作以后发现就没有问题了,那就是出在memset上了,我测试了一下strlen(p)的长度,我去,110, 这个我也是纳闷了,为什么多了10字节,从哪来的,又是怎么算的,目前找到了原因,但对于strlen(p) = 110这个我还是不明白,有明白的同僚可以交流一下(邮箱:wgymaoliran@sina.com)
修改之后内存就正好是100,释放都OK了: