new和delete
new和delete是运算符,不是函数,因此运行效率比较高
为了与C语言兼容,C++仍保留了malloc和free,但是建议使用new和delete
new运算符
使用方法:
指针变量 = new 类型(常量);
指针变量 = new 类型[表达式]; //数组
指针变量 = new 类型[表达式][表达式]; //二维数组
作用:从堆上分配一块“类型”指定大小的存储空间,返回首地址
其中,常量是初始化的值,可以省略,创建数组对象时,不能为对象指定初始值
delete运算符
普通类型(非数据):delete 指针变量
数组:delete[] 指针变量
#include <stdlib.h>
#include <iostream>
using namespace std;
int main(void) {
//分配基础类型
//第一种分配动态内存不执行初始化
int *p1 = new int;
*p1 = 100;
//第二种分配动态内存同时执行初始化
int *p2 = new int(100);
// 第三种 malloc 返回值是 void *
int *p3 = (int *)malloc(sizeof(int));
free(p1); //基础类型可以 new free 可以混搭
delete p3; //基础类型可以 malloc delete 可以混搭
delete p2; //free(p2); 同样效果
//分配数组变量
int *b1 = (int *) malloc(sizeof(int)*10);
//p[0] - p[9] *(p+9)
int *b2 = new int[10];
delete b1; // free(p1); 可以混搭
//free(p2); //可以混搭
delete[] b2;
system("pause");
return 0;
}
内存泄漏
程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
因此,申请的内存用完一定要释放
存储类型
自动变量(auto)、静态变量 (static)、外部变量(extern) 以及寄存器变量(register)
auto - 函数中所有的非静态局部变量。比如,程序中的 int a,b,c; int i=0; 等变量
register -
一般经常被使用的的变量(如某一变量需要计算几千次)可以设置成寄存器变量,register 变量会被存储在寄存器中,计算速度远快于存在内存中的非 register 变量。
static -
在变量前加上 static 关键字的变量。
extern -
把全局变量在其他源文件中声明成 extern 变量,可以扩展该全局变量的作用域至声明的那个文件,其本质作用就是对全局变量作用域的扩展。
注意:
C++ 的 register 关键字已经优化,如果我们打印它的地址,它就变成了
普通的 auto 变量
变量作用域和生存周期
可以返回函数内部的地址:
动态分配的内存地址
局部静态变量的地址
全局静态变量和外部变量的地址