C++中的动态内存分配
C语言是通过库函数来完成动态内存分配的,而C++是通过关键字从语言层面支持的。
C语言中的malloc是基于字节来进行内存申请的,C++中是基于类型来进行的。
delete加上[]代表释放数组,如果不加的话只会释放第一个元素的内存空间。
示例程序如下:
1 #include <stdio.h> 2 3 int main() 4 { 5 int* p = new int; 6 7 *p = 5; 8 *p = *p + 10; 9 10 printf("p = %p ", p); 11 printf("*p = %d ", *p); 12 13 delete p; 14 15 p = new int[10]; 16 17 for(int i=0; i<10; i++) 18 { 19 p[i] = i + 1; 20 21 printf("p[%d] = %d ", i, p[i]); 22 } 23 24 delete[] p; 25 26 return 0; 27 }
运行结果如下:
new和delete在使用体验上比malloc和free好,malloc和new的区别如下:
new关键字的初始化:
示例程序如下:
1 #include <stdio.h> 2 3 int main() 4 { 5 int* pi = new int(1); 6 // int* pa = new int[1]; 7 8 float* pf = new float(2.0f); 9 char* pc = new char('c'); 10 11 printf("*pi = %d ", *pi); 12 printf("*pf = %f ", *pf); 13 printf("*pc = %c ", *pc); 14 15 delete pi; 16 delete pf; 17 delete pc; 18 19 return 0; 20 }
运行结果如下:
new int(1)和new int[1]是不同的,一个是申请内存并初始化,一个是申请有一个元素的数组。
C++中的命名空间:
C++中命名空间的定义:
C++命名空间的使用:
示例程序:
1 #include <stdio.h> 2 3 namespace First 4 { 5 int i = 0; 6 } 7 8 namespace Second 9 { 10 int i = 1; 11 12 namespace Internal 13 { 14 struct P 15 { 16 int x; 17 int y; 18 }; 19 } 20 } 21 22 int main() 23 { 24 using namespace First; 25 using Second::Internal::P; 26 27 printf("First::i = %d ", i); 28 printf("Second::i = %d ", Second::i); 29 30 P p = {2, 3}; 31 32 printf("p.x = %d ", p.x); 33 printf("p.y = %d ", p.y); 34 35 return 0; 36 }
运行结果如下:
小结:
C++中内置了动态内存分配的专用关键字
C++中的动态内存分配可以同时进行初始化
C++中的动态内存分配是基于类型进行的
C++中命名空间概念用于解决名称冲突问题