内存
C++中内存分为5个区
1.栈
一般函数内的局部变量都会放到栈中, 有编译器自动分配和释放
栈有上限,越界会程序会崩溃
char buff[2000000]; //2M
vs下大约2M大小就会栈空间溢出崩溃
栈运行速度比堆快,空间有限,地址从高往低分配
2.堆
程序员用malloc/new分配, 用free/delete来释放,如果没有释放,程序接受后系统会回收.程序长时间运行,不释放内存会导致内存泄漏
特点运行速度慢,容易产生碎片,地址从低往高分配
只要不超过物理内存即可
3.全局/静态存储区
全局变量和静态变量static, 程序接受后会由系统释放
内部又分为BSS段和数据段,简单差别如下:
BSS段 存放程序中未初始化的全局变量
数据段 存放程序中已初始化的全局变量
了解即可
4.常量存储区
只读字符串常量
5.程序代码区
二进制文件
重点关注堆栈
malloc和free
c语言中:使用malloc和free分配和释放内存用, malloc()和free()是函数.
用法:
#include <stdlib.h>
void *malloc(int NumBytes); //malloc是函数,所以函数形参是要分配的字节数
//void*是可以强制转换类型
//需要free()函数释放内存;
void free(void *FirstByte) //将malloc分配的内存空间还给程序,释放
//定义
int* p = NULL;
p = (int *)malloc(sizeof(int)); //malloc(4); 32位
//malloc返回是void* ,这里要用int* 强转一次
free(p); //释放
//返回值, 不为NULL即为成功
if(p!=NULL)
cout <<"分配成功" << endl;
//程序中最好加上防御式编程
char用法:
char* point = NULL;
point = (char*)malloc(100 * sizeof(char));
if (point != NULL)
{
strcpy_s(point, 100,"hello world!");
cout << point << endl;
free(point);
}
strcpy_s 更安全的版本,能够监测是否越界,报错出来警告,中间参数为目标大小
strcpy 越界不会警告,直接运行,如果空间不足会拷贝不全
new和delete
这俩是运算符,标识符,与malloc不同处之一
一样干的都是分配和释放内存的功能
new一般用法
指针变量名 = new 类型标识符;
指针变量名 = new 类型标识符(初始值);
指针变量名 = new 类型标识符[内存单元个数]; //分配数组
例1:
int* test_new = new int;
if (test_new != NULL)
{
*test_new = 8;
cout << *test_new << endl;
delete test_new;
}
例2:
int* test_new = new int(18);
if (test_new != NULL)
{
//*test_new = 8;
cout << *test_new << endl;
delete test_new;
}
//输出:18
例3:
int* pa = new int[100]; //开辟大小为100整型
if (pa != NULL)
{
int* q = pa;
*q++ = 8;
*q++ = 18;
cout << *pa << endl; //8
cout << *(pa + 1) << endl; //18
delete[] pa;//这里一定要加[]
}
后续补充new对象相关