C++学习笔记--new和namespace

来源:互联网 发布:sql server下载安装 编辑:程序博客网 时间:2024/06/05 18:20

内存申请

在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;