C++ 方式的内存分配与释放 new 和 delete在内存管理上,C++ 和 C 有着完全不同的两套方案。当然,C++的总是同时兼容C。C的那一套方案在C++里同样可行。 我们首先看看纯C++的: new 和 delete。 new 从字面上看意思为 “新”;而delete 字面意思为“删除”。二者在C++中内存管理中大致的功能,应是一个为“新建”,一个为“删除”。

  1new

必备:C++的空间申请与释放

  new 是 c++ 的一个关键字。被当作像 +、-、* 、/ 一样的操作符。它的操作结果是在申请到一段指定数据类型大小的内存。

  语法: 指针变量 = new 数据类型;

  new 将做三件事:

  1、主动计算指定数据类型需要的内存空间大小;

  2、返回正确的指针类型;

  3、在分配内存的一,将按照语法规则,初始化所分配的内存。

  这是什么意思呢?看看例子吧:

  int* p;

  p = new int;

  和以往不一样,p 这回不再“寄人篱下”,并不是指向某个已存在的变量,而是直接指向一段由new 分配而来的新内存空间。 “p 指向一段由new 分配而来的新内存空间” 这句话等同于: “new 分配一段新的内存空间,然后将该内存空间的地址存入到变量p中。” 所以,最终p中仍然是存储了一个变量的地址,只是,这是一个“无名”变量。 指向原有的某个变量,和指向一段新分配的内存空间,有什么区别呢? “原有的变量”,可以比喻成指向一间原有的,并且有主的房间。而“新分配的内存空间”,则像是一个“临时建筑物”。我们必须在不用它的时候,主动将它拆 迁。拆迁的工作由delete来完成。 当指针变量通过 new ,而得到一个内存地址后,我们就可以像以前的所说的,通过该指针,通过*号,而对该内存地址(一个无名的变量),进行操作。 如:

  int* p = new int;

  *p = 100;

  cout << *p << endl;

  屏幕将输出100。

  在new 时初始化内存的值 ,new 也可以在申请内存空间时,直接设置该段内存里要放点什么.

  语法: 指针变量 = new 数据类型(初值);

  这样,上例可以改为:

  int* p = new int(100);

  cout << *p << endl;

  如果你申请的是字符类型的空间,并且想初始化为‘A': char* pchar = new char('A');

  21delete

  语法: delete 指针变量;

  delete 将释放指定指针所指向的内存空间。

  举例:

  int* p;

  p = new int;

  *p = 100;

  cout << *p << endl;

  delete p;

  system("PAUSE");

  注意,当一个指针接受delete操作后,它就又成了一个“指向不明”的指针。尽管我们可以猜测它还是指向“原来的房子”,然而,事实上,那座“房子”已 经被delete “拆迁”掉了。

  而C语言中主要是malloc()与free,他们与C++的区别在于,new与delete可以同时触发构造和析构,而在C语言中,对象是不可以释放大于一次的空间的。

  下面来看一个完整的空间申请和释放的简单代码:

  #include

  using namespace std;

  int main()

  {

  //new

  /*int*p = (int*)malloc(sizeof(int));*/

  int*p1 = new int;

  //new+type(),两边类型要匹配,int对应newint,且可以直接初始化,即new int(12),则初始化值为12

  //char*c = new char;

  *p1 = 12;//写

  cout << *p1 << endl;//读

  delete p1;//delete+指针

  system("pause");

  return 0;

  }

  3*号的妙用

  接下来我们要讲解的是*号,它有三种用法,在声明时带有*号,表明其为指针变量,而*加上地址,则是代表地址操作符,最后一种用法是我们最熟悉的数字*数字,即代表着乘法。

  1)先来看指针变量:

  #include

  using namespace std;

  int main()

  {

  //在声明变量的时候*代表指针变量

  int a = 100;

  int*p =&a ; //p是指针变量,指向a的值

  system("pause");

  return 0;

  }

  2)再来看看地址操作符:

  #include

  using namespace std;

  int main()

  {

  //在声明变量的时候*代表指针变量

  int a = 100;

  int*p = &a; //p是指针变量,指向a的值

  *p; //地址操作符,分为读写两种操作

  cout << *p << endl; //读

  *p = 123; //改变数据是写

  cout << a << endl;

  system("pause");

  return 0;

  }

  屏幕输出100与123.

  3)第三种为常用的乘法语句,此处不再赘述。