一、new/delete(动态开辟/释放)
在C语言中我们使用malloc动态开辟,free释放
在C++中我们使用关键字 "new"动态开辟,delete释放
1.定义:
动态开辟:new + 类型
变量:int *p=new int(10); // (值)
数组:int *p=new int[10]; // [数组长度]
释放:delete + 指针
变量:delete p;
释放:delete[] p;
//C语言malloc动态开辟、free释放
int* p1 = (int*)malloc(sizeof(int)* 10);
if (p1 == NULL)
{
cout << "error: no memory!" << endl;
}
free(p1);
//C++new动态开辟,delete释放
int* p2 = new int[10];//创建一个int类型数组且长度为10
delete[] p2;//数组释放
int* p3 = new int(10);//创建一个int类型变量且初始化值为10
cout << *p3 << endl;
delete p3;//变量释放
一般不予许创建一个有限数组并具体初始化为某个值(大于0),例如:创建并初始化一个长度为10,值为5的整型数组
//特例
int* p4 = new int[10]();//创建一个int类型且长度为10的数组并全部初始化为0
delete[] p4;
2.new和malloc区别
new | malloc | |
开辟空间的位置 | 自主存储区 | 堆 |
属性 |
关键字 | 函数 |
初始化 | 边开辟初始化 | 只开辟内存 |
若内存不足 开辟失败 | 抛出异常 ,不会为NULL | 返回NULL |
是否可以开辟常量内存块 | 可以 | 不可以 |
注:开辟常量内存块,需要初始化:const int * p=new const int(10);
delete p;
且一般不会开辟常量数组,无意义
3.动态开辟和释放二维数组
//malloc
int** p7 = (int**)malloc(sizeof(int*)* 10);
for (int i = 0; i < 10; i++)
{
p7[i] = (int*)malloc(sizeof(int)* 10);
}
for (int i = 0; i < 10; i++)
{
free(p7[i]);
}
free(p7);
//new
int** p8 = new int*[10];
for (int i = 0; i < 10; i++)
{
p8[i] = new int[10];
}
for (int i = 0; i < 10; i++)
{
delete[] p8[i];
}
delete[] p8;
4.重定义:
int a;
char *p=new (&) char 'a';
首先在栈上开辟四个字节大小的空间,然后创建一个指针指向new开辟使用一个字节存放‘a’为自定义区域(红色部分),而剩下三个字节空间依旧在栈上(蓝色部分)
二、namespace名字空间作用域:防止名字冲突
在C语言中,作用域有:全局作用域、局部作用域、
在C++中,作用域有:全局作用域、局部作用域、名字空间作用域、类作用域
1.namespace + 作用域
使用方法: ::全局作用域访问符
namespca ::名字空间作用域访问符
类 ::类作用域访问符
2.using声明: using +名字空间名+ :: +名字空间作用域的一个变量//一次只暴露一个变量
using指示符: using +namespcae+名字空间名//一次只暴露所有变量
namespace wh
{
int a = 11;
int Sum(int a, int b)
{
return a + b;
}
}
namespace wh
{
int a = 20;
}
int main()
{
using wh::a;//using声明
using namespace wh;//using指示符
int b = a;
int rt = Sum(10, 20);
cout << b << endl;//名字空间同名,合并,a重定义,编译出错
return 0;
}
注:若名字空间作用域同名,则会合并