第10课 C++中的动态内存分配

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++中命名空间概念用于解决名称冲突问题

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9521579.html