动态内存分配问题
动态内存分配问题:c中供程序使用的储存空间,有程序区,静态储存区,动态储存区。
c++中,我们把内存进一步详细分为5个区域;
(1)栈:一般函数内的局部函数都会放在这里,由编译器自动分和释放。
(2)堆:程序员malloc/new分配,用free/delete来释放。忘记释放后,程序结束系统会自动回收
(3)全局/静态存储区:放全局变量和静态变量static。程序结束时系统释放
(4)常量存储区:"i love you";
(5)程序代码区
堆和栈不同的用途和区别
(1)栈空间有限的,这是系统自动分配的, int a = 4,分配速度快,程序员也控制不了
(2)堆:只要不超出实际拥有的物理内存,也在操作系统允许你能够分配的最大内存大小之内,都可以分配给你,分配速度比栈慢,好处是灵活,随时用new/malloc分配,用free/delete释放。
//在C语言中,用malloc和free从堆中分配和释放内存
void *malloc(int NumBytes);//NumBytes:要分配的字节数
//分配成功返回分配的地址指针,分配失败返回NULL
//当这段分配的内存你不使用时,应该用free释放掉供其他地方使用
void free(void *FirstByte)//将之前用malloc分配的内存空间还给程序(操作系统),也就是说释放了这块内存,被系统回收,并在需要时由系统分配给其他地方
int * p = NULL;
p = (int *)malloc(sizeof(int));//把从堆中分配的四个字节强转为int *类型
if(p != NULL) {
//分配成功
*p = 5;
cout << *p <<endl;
free(p);//完成任务后释放
}
char * point = NULL;
point = (char*)malloc(100 * sizeof(char));
if(point != NULL)
{
//strcpy(point, "hello world");这种会有内存溢出的风险,而且不会警告
strcpy_s(point, 100, "hello world");//中间100表示有一百个字节可以分配,若拷贝的内容大于100个字节就会报错
//strcat----strcat_s升级版(字符串拼接)
cout << point <<endl;
free(point);
}
int *p = (int*)malloc(sizeof(int)*100);//分配可以放得下100个整数的内存空间
if(p != NULL)
{
int *p = q;
*q++ = 1;//赋值1
*q++ = 5;//对第二个int空间赋值5
cout<< *p<< endl;//1
cout<<*(p+1)<<endl;//5
free(p);
}
new和delete:是运算符(标识符),c++中就用new/delete分配和释放内存,不再使用malloc和free来分配和释放内存
new,delete也和malloc,free干了一样的事就是分配和释放内存,同时也做了更多的事,在new出一个新对象时还会调用对象的构造函数,但是malloc就不会,所以在c++中一定要使用new和delete取代malloc和free
new一般使用格式:
(1) 指针变量名 = new 类型标识符;
(2) 指针类型名 = new 类型标识符(初始值);//注意这里圆括号括起来,表示初始值
(3) 指针类型名 = new 类型标识符 [内存单元个数] //注意这里是[ ]
int * myint = new int;
if(myint != NULL)
{
*myint = 8;
cout << *myint <<endl;
delete myint;//释放单个myint空间
}
int * myint = new int(18);//分配4个字节的内存空间,同时赋初值为18
if(myint != NULL)
{
cout << *myint <<endl;//18
delete myint;//释放单个myint空间
}
int * myint = new int[100];//开辟了一个大小为100的整形的数组空间
if(myint != NULL)
{
int * q = myint;
*q++ = 12;
*q++ = 18;//执行完这句q已经指向下表为2的int空间
cout << *myint <<endl;//第一个int空间 12
cout << *(myint++) << endl;//第二个int空间 18
delete[] myint;//释放整个myint空间,注意这种格式
//new的时候我们用[],那么delete的时候我们必须用[],[]不写数组大小
}
额外补充知识
(1)配对使用有malloc成功必然有free,有new成功必然有delete;
(2)free/delete,不要重复调用;