c/c++区别(三)(7-8) new delete namespace

 

一.New用法(开辟内存)

系统计算所需大小

使用new运算符时必须已知数据类型,new运算符会向系统堆区申请足够的存储空间,如果申请成功,就返回该内存块的首地址,如果申请不成功,则返回零值。

1.开辟单变量地址空间

(1)new int;  //开辟一个存放整数的存储空间,返回一个指向该存储空间的地址。int *a = new int 即为将一个int类型的地址赋值给整型指针a

(2)int *a = new int(5) 作用同上,但是同时将整数空间赋值为5 开辟时记录了首地址 大小

 

2.开辟数组空间:

指针变量名=new 类型名[下标表达式];
        delete [ ] 指向该数组的指针变量名;

 

new int[]//[]代表数组的长度

int* parr = new int[10]();//代表数组长度为10 此时数组不能初始化 若有两个数据 不知该放在何处 只能元素全置为零

delete [] qarr;

 

两式中的方括号是非常重要的,两者必须配对使用,如果delete语句中少了方括号,因编译器认为该指针是指向数组第一个元素的指针,会产生回收不彻底的问题(只回收了第一个元素所占空间),加了方括号后就转化为指向数组的指针,回收整个数组。

 delete []的方括号中不需要填数组元素数,系统自知。即使写了,编译器也忽略。

 

New和malloc的区别

  1. new是关键字 malloc是函数
  2. new不需要强转 malloc要强转
  3. malloc只是单纯开辟内存 不能初始化

New 不仅能开辟内存 还能初始化

 

动态开辟二维数组

int ** p = new int*[10];//开辟二维数组

for(int i = 0;i<10;i++)

{

p[i] = new int[10];

}

   delete[] p;//用于释放动态分配的数组存储区域。

二.delete用法(释放内存)

1. 删除单变量地址空间

       int *a = new int;

       delete a;   //释放单个int的空间

2. 删除数组空间

       int *a = new int[5];

       delete []a;    //释放int数组空间

 

注意:指针删除与堆空间释放。删除一个指针p(delete p;)实际意思是删除了p所指的目标(变量或对象等),释放了它所占的堆空间,而不是删除p本身(指针p本身并没有撤销,它自己仍然存在,该指针所占内存空间并未释放),释放堆空间后,p成了空指针。

 

注意:内存泄漏(memory leak)和重复释放。new与delete 是配对使用的, delete只能释放堆空间。如果new返回的指针值丢失,则所分配的堆空间无法回收,称内存泄漏,同一空间重复释放也是危险的,因为该空间可能已另分配,所以必须妥善保存new返回的指针,以保证不发生内存泄漏,也必须保证不会重复释放堆内存空间。

 

C++中若内存开辟失败 则抛出异常

C内存不足 则会返回NULL

c语言无法开辟常量内存块

Const  Int* p = new const int(10);

Delete p;

 

三.重定位new

 

一般来说,使用new申请空间时,是从系统的“堆”(heap)中分配空间。申请所得的空间的位置时根据当时的内存的实际使用情况决定的。但是,在某些特殊情况下,可能需要在程序员指定的特定内存创建对象,这就是所谓的“定位放置new”(placement new)操作。

定位放置new操作的语法形式不同于普通的new操作。例如,一般都用如下语句A* p=new A;申请空间,而定位放置new操作则使用如下语句A* p=new (ptr) A;申请空间,其中ptr就是程序员指定的内存首地址

    

四.名字空间作用域

 

1..什么是命名空间

命名空间是ANSI C++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突。

2.命名空间的作用---->为解决命名冲突问题

名字空间的作用主要是为了解决日益严重的名称冲突问题。随着可重用代码的增多,各种不同的代码体系中的标识符之间同名的情况就会显著增多。解决的办法就是将不同的代码库放到不同的名字空间中。

3.使用

::全局作用域访问符

名字空间::  名字空间作用域访问符

CY1202::sum(a.b)//调用的是CY1202的使用域下的sum函数

如:

namespace s1 //指定命名空间s1
{

int a; 
double b;


namespace 是定义命名空间所必须写的关键字,s1是用户自己指定的命名空间的名字(可以用任意的合法标识符),在花括号内是声明块,在其中声明的实体称为命名空间成员(namespace member)。现在命名空间成员包括变量a和b,注意a和b仍然是全局变量,仅仅是把它们隐藏在指定的命名空间中而已。如果在程序中要使用变量a和b,必须加上命名空间名和作用域分辨符“::”,如s1::a,s2::b。这种用法称为命名空间限定(qualified),这些名字(如s1::a)称为被限定名 (qualified name)。C++中命名空间的作用类似于操作系统中的目录和文件的关系,由于文件很多,不便管理,而且容易重名,于是人们设立若干子目录,把文件分别放到不同的子目录中,不同子目录中的文件可以同名。调用文件时应指出文件路径。

 

 以免产生老师点名叫张三时,3个人都站起来应答,这就是名字冲突,因为他们无法辨别老师想叫的是哪一个张三,同名者无法互相区分。为了避免同名混淆,学校把3个同名的学生分在3个班。这样,在小班点名叫张三时,只会有一个人应答。也就是说,在该班的范围(即班作用域)内名字是唯一的。如果在全校集合时校长点名,需要在全校范围内找这个学生,就需要考虑作用域问题。如果校长叫张三,全校学生中又会有3人一齐喊“到”,因为在同一作用域中存在3个同名学生。为了在全校范围内区分这3名学生,校长必须在名字前加上班号,如高三甲班的张三,或高三乙班的张三,即加上班名限定。这样就不致产生混淆。

4. using 声明 声明只能暴露一个符号 using CY1202::sum;

using 指示符 指示符能暴露所有符号 using namespace CY1202;

5.名字空间重名  ==>合并

猜你喜欢

转载自blog.csdn.net/xiaobaibai915/article/details/84390341