c语言free释放内存详细说明
1. free只能释放动态分配的内存空间(堆空间)。由(malloc,calloc,realloc)等函数
分配。
例:int b=10;
int* i = &b;
free(i);//段错误,不能释放栈空间内存
2. 使用free释放堆内存空间时,其内部会判断该指针是否有效,然后判断指向的内
存是否是一整块动态分配内存(malloc,calloc,realloc)。
例1:char *s = (char*)malloc(1000);
char *s1 = s+100;
free(s1); //错误,s1并不是指向一整块动态分配的堆空间,s1只是指向动态分配内存的一部分。
s1 = s;
free(s1);//正确,现在s1指向的就是一整块动态分配的堆空间。
例2:
char* s = (char*)malloc(1000);
char* s1=s;
strcpy(s,"abcdefg");
char* s2 = strtok(s,"c");
s2 = strtok(NULL,"c");
free(s2); //错误,和例1一样,s2指向的只是一部分动态分配的内存空间
s2 = s;
free(s2); //正确。
c++ new和delete运算符说明
class A
{};
A* a = new A();//表示申请一个存放A类对象的内存空间,并调用构造函数A()初始化对象。
A* a1 = new A[10];//表示申请10个存放A类对象的内存空间,并为每个对象调用默认构造函数初始化。
delete a;//表示释放a指针所指向对象的内存空间,并调用a指针所指对象的析构。
delete[] a1;//表示释放a1指针所指向的内存空间,并为每个对象调用析构函数。
注意:1)delete释放由new申请的内存空间,虽然可以释放由new[]申请的内存空间,但是会导致除首地址对象外其他对象不调用析构,出现内存泄漏。delete也能释放由malloc申请的内存空间,只是会调用对象的析构函数。同样free虽然也能释放由new申请的内存空间,但是他不会调用对象的析构,因此会导致内存泄漏。(建议大家不要混着用)
2)delete[]只能释放由new[]申请的内存空间,不能释放new和malloc申请的内存空间。free不能释放由new[]申请的内存空间,这样会导致程序崩溃(释放无效指针)
3)delete和free释放内存空间时,都会先判断这块内存是否有效,然后检测这块内存是否是一整块动态分配的内存,在c/c++里,不允许只释放申请内存里的一部分内存,只能释放申请的一整块完整的内存空间。