设为首页 加入收藏

TOP

C++ 中的new、malloc、namespace(一)
2019-05-23 14:33:16 】 浏览:72
Tags:new malloc namespace

1,这些新引入的成员想要解决 C 语言中存在的一些问题,

 

2,动态内存分配:

    1,C++ 中的动态内存分配:

       1,C++ 中通过 new 关键字进行基于类型的动态内存申请;

           1,C 语言中自身不包含动态内存分配的内容,通过 malloc 库函数基于字节进行;

       2,C++ 中的动态内存申请是基于类型进行的;

       3,delete 关键字用于内存释放;

       4,变量申请:

1 Type* pointer = new Type;

2 // ......,和 C 语言中的使用方式相同;

3 delete pointer; 

        5,数组申请:          

1 Type* pointer = new Type[N];  // N 表示数组包含的元素个数;
2 // ......,和 C 语言中的使用方式相同;
3 delete[] pointer;  // 要加上中括号,否则只释放了数组占用的第一个内存空间,剩下的内存空间都没有释放,造成内存泄漏;

      

3,C++ 中的动态内存分配实例分析:

    1,main.cpp 文件:

 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\n", p);
11     printf("*p = %d\n", *p);
12     
13     delete p;
14 
15     printf("p = %p\n", p);
16     
17     p = new int[10];  // p 所指向的这片内存空间至少占用了 40 字节;
18     
19     for(int i=0; i<10; i++)
20     {
21         p[i] = i + 1;  // 像数组一样使用;
22         
23         printf("p[%d] = %d\n", i, p[i]);
24     }
25     
26     delete[] p;
27     
28     return 0;
29 }

    2,输出结果:

 1 p = 0x9e4e008
 2 *p = 15
 3 p = 0x9e4e008 //这个结果说明,释放的是指向的空间,但是这个时候指针的值还是原来的值;
 4 p[0] = 1
 5 p[1] = 2
 6 p[2] = 3
 7 p[3] = 4
 8 p[4] = 5
 9 p[5] = 6
10 p[6] = 7
11 p[7] = 8
12 p[8] = 9
13 p[9] = 10

    3,本质上和使用 malloc 和 free 没有太大差异,只不过说在使用体验上变得更好;

 

4,new 关键字与 malloc 函数的区别:

    1,new 关键字是 C++ 的一部分;

    2,malloc 是由 C 库提供的函数;

       1,如果 C 语言编译器无法提供库函数,那么 C 语言编译器无法进行动态内存分配;

    3,new 以具体类型为单位进行内存分配;

    4,malloc 以字节为单位进行内存分配;

    5,new 在申请单个类型变量时可以进行初始化;

       1,这是要注意的区别;

    6,malloc 不具备内存初始化的特性;

       1,calloc 先申请,然后全部设置为 0,这不是真正意义上的初始化;

   

5,new 关键字的初始化: 

    1,代码示例:

1 int* pi = new int(1);
2 float* pf = new float(2.0f);
3 char* pc = new char('c);

   

6,初始化动态内存编程实验:

    1,main.cpp 文件:

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int* pi = new int(1);  // 申请 int 并初始化为 1;
 6     // int* pa = new int[1];  // 申请一个 int 大小的数组;
 7     
 8     float* pf = new float(2.0f);
 9     char* pc = new char('c');
10 
11     printf("*pi = %d\n", *pi);
12     printf("*pf = %f\n", *pf);
13     printf("*pc = %c\n", *pc);
14     
15     delete pi;
16     delete pf;
17     delete pc;
18     
19     return 0;
20 }

   2,输出结果:

     *pi = 1

     *pf = 2.000000

     *pc = c

   

7,C++ 中的命名空间:

    1,在 C 语言中只有一个全局作用域;

       1,C 语言中所有的全局标识符共享同一个作用域;

           1,每个函数的函数体就是局部作用域;

       2,标识符之间可能发生冲突;

           1,工程中能不用全局作用域就不用全局作用域,因为工程上往往很多人同时进行开发,可能造成自己和别人定义的全局变量相冲突,这样会浪费精力解决冲突;

    2,C++ 中提出了命名空间的概念:

       1,命

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇40.QT-QPropertyAnimationdong和Q.. 下一篇C++中的新型类型转换

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目