内存
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);
void free(void *FirstByte)
int* p = NULL;
p = (int *)malloc(sizeof(int));
free(p);
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)
{
cout << *test_new << endl;
delete test_new;
}
例3:
int* pa = new int[100];
if (pa != NULL)
{
int* q = pa;
*q++ = 8;
*q++ = 18;
cout << *pa << endl;
cout << *(pa + 1) << endl;
delete[] pa;
}
后续补充new对象相关
|