内存申请
在C中我们学习了动态内存分配(小知识:一般动态分配回来的内存空间比需要的略大)的函数,为什么我们在C++中还要学习新的内存分配方式?那是因为C中的malloc、calloc、等都不是C中自带的,而是通过库函数调用得到的,对于一些不支持这些库编译器就无法使用。C++中使用new关键字(表面是C++自带的,不取决于编译环境使用)进行动态内存分配,在C中的动态内存分配是基于字节分配的,但是C++中是基于类型来进行动态内存分配的,在使用完后通过delete关键字来释放内存。new有两种方式申请,对单个变量类型申请和对数组申请。
变量申请:type *p = new type;
...
...
delete p;
数组申请:type *p = new type[N];
...
...
delete []p;//区别与单个变量的释放
在进行new分配单个变量类型的内存时可以对申请的空间进行初始化,如;
int *pi = new int(1);
float *pf = new float(2.0f);
char * pc = new char('a');
注意:int *p = new int(2);区别于int *p = new int[2]; //前者是进行初始化,后者却是申请一片连续的空间
Test *pm = new Test();//在堆中创建一个对象。
new与malloc的区别:
1、new关键字是C++的一部分,malloc是由C库提供的函数。
2、new以具体类型为单位进行内存分配,malloc以字节为单位进行内存分配。
3、new在申请单个类型变量时可以进行初始化,malloc不具备初始化的特性。
4、malloc仅仅根据需要申请一定量的内存空间。
5、用new申请一个类对象时会触发调用构造函数,用malloc申请同样大小空间时只是返回这一片内存的首地址。
6、对象的创建只能用new,malloc不适合用于面向对象开发。
7、释放内存时,delete会触发析构函数的调用,使对象彻底被销毁,free仅仅是释放申请回来的内存空间,但是指针本身依然存在。
8、delete和free不能混用,如果用delete释放malloc申请的空间,由于malloc申请的空间并不会生成一个合法的对象,调用析构函数可能引起程序崩溃;如果用free释放new申请的空间可能导致对象未被销毁而导致内存泄漏。
命名空间
C中只有一个全局作用域,所有的全局标识符共享一个作用域,这样就可能导致标识符之间发生冲突,所以C++为了更好的处理这种情况就提出了命名空间的概念,命名空间将全局作用域(全局作用域也叫默认命名空间)分成不同的部分,这样就使不同命名空间部分里的标识符即便重名也不会发生冲突。
int x = 1;//默认作用域里的变量
namespace Name1
{
int i = 0;
namespace Name2
{
...
...
int j = 1;
}
...
...
int k = 1;
}
可以看出命名空间的定义还是比较简单的,并且它还可以嵌套定义。
使用整个命名空间:
using namespace Name1;
i = 3;//先说明再使用
k = 5;
使用命名空间中的变量:
using Name1 :: i; i = 3;//先说明再使用
using Name1 :: Name2 :: j; j = 2;//先说明再使用
Name1 :: i = 4;//直接使用
使用默认命名空间中的变量:
:: x;