C语言内存分配:
静态内存分配,分配内存大小的是固定,问题:1.很容易超出栈内存的最大值 2.为了防止内存不够用会开辟更多的内存,容易浪费内存
动态内存分配,在程序运行过程中,动态指定需要使用的内存大小,手动释放,释放之后这些内存还可以被重新使用(活水)
1.栈区(stack)
windows下,栈内存分配2M(确定的常数),超出了限制,提示stack overflow错误
自动分配,释放
2.堆区(heap)
在程序运行过程中,可以随意的开辟指定大小的内存,以供使用,相当于Java中的集合
程序员手动分配释放,malloc分配内存,返回指针(p),free(p)释放内存,然后把指针置空。操作系统80%内存
创建一个数组,动态指定数组的大小,返回P指向内存起点。
realloc 重新分配内存
int* p2 = realloc(p, sizeof(int) * (len + addLen));1.原来内存的指针 2.内存扩大之后的总大小,只需要释放P2,P1也就被释放了。
重新分配内存的两种情况:
1.缩小,缩小的那一部分数据会丢失
2.扩大,(连续的)
1.如果当前内存段后面有需要的内存空间,直接扩展这段内存空间,realloc返回原指针 2.如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据库释放掉,返回新的内存地址 3.如果申请失败,返回NULL,原来的指针仍然有效
3.全局区或静态区
4.字符常量区
5.程序代码区
内存分配的几个注意细节
1.不能多次释放
2.释放完之后(指针仍然有值),给指针置NULL,标志释放完成
3.内存泄露(p重新赋值之后,再free,并没有真正释放内存)
C++动态内存分配
C++ 通过new(delete)动态内存分配
使用C的写法不会调用构造方法,C++写法调用构造方法
class Teacher{
private:
char* name;
public:
Teacher(char* name){
this->name = name;
cout << "Teacher有参构造函数" << endl;
}
~Teacher(){
cout << "Teacher析构函数" << endl;
}
void setName(char* name){
this->name = name;
}
char* getName(){
return this->name;
}
};
void func(){
//C++
//会调用构造和析构函数
Teacher *t1 = new Teacher("jack");
cout << t1->getName() << endl;
//释放
delete t1;
//C
//Teacher *t2 = (Teacher*)malloc(sizeof(Teacher));
//t2->setName("jack");
//free(t2);
}
void main(){
func();
//数组类型
//C
//int *p1 = (int*)malloc(sizeof(int) * 10);
//p1[0] = 9;
//free(p1);
//C++
int *p2 = new int[10];
p2[0] = 2;
//释放数组 []
delete[] p2;
system("pause");
}
网友评论