`
mmdev
  • 浏览: 12844747 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

C++ 方式的内存分配与释放 new 和 delete

 
阅读更多
C++ 方式的内存分配与释放 new 和 delete

在内存管理上,C++ 和 C 有着完全不同的两套方案。当然,C++的总是同时兼容C。C的那一套方案在C++里同样可行。

我们首先看看纯C++的那一套: new 和 delete。

new ,从字面上看意思为 “新”;而delete 字面意思为“删除”。二者在C++中内存管理中大致的功能,应是一个为“新建”,一个为“删除”。

 

20.2.1new

 

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。

 

20.2.2在new 时初始化内存的值

 

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

 

语法:

 

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

 

这样,上例可以改为:

 

int* p = new int(100);

cout << *p << endl;

 

如果你申请的是字符类型的空间,并且想初始化为‘A':

 

char* pchar = new char('A');

 

20.2.3delete

 

语法:

delete指针变量;

 

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

 

举例:

 

int* p;

p = new int;

 

*p = 100;

cout << *p << endl;

 

delete p;

 

system("PAUSE");

 

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

 

20.2.4实验: new 和 delete

 

很简单的例子。

第一步:

首先,在CB新建一个控制台程序。然后把上一小节的代码放到main()函数内。运行。结果如下:

 

(new 和 delete)

 

按任意键退出后,保存工程(Ctrl + Shift + S)。

 

第二步:

接下来我们来观察指针变量被delete之后,所指向的内存会是什么。但,这是一件犯了C、C++编程大忌的事:访问一个已经delete 的指针的值。如果你最近运气很差,你的CB可能会被强行退出。所以,你明白我们为什么要先存盘了,对不?

 

在前面的代码中,加入以下加粗加红的一行(同时,你也应注意我的加的注释):

 

int* p;

p = new int;

 

*p = 100;

cout << *p << endl;

 

delete p;//p所指向的内存空间已经被释放

 

cout << *p << endl;//我们故意去访问此时p所指的内存

 

system("PAUSE");

 

运行结果:

 

(访问delete之后的指针)

 

44244844??在你的机器可能不是这个数,但一定同样是怪怪的值。 原来是好端端的100,现在却成了44244844。不要问我这是为什么?昨天来时,美眉还住在这里一座别致小阁楼里,今日故地重游,这里竟成废墟一片,依稀只见破墙上尚有:“拆!——城建局”的字样?!

 

new 是管建房的,而 delete就一个字:拆!

 

请大家自行在CB上完成本实验。我没有提供本题的实际工程。

20.2.5new 和 delete 的关系

 

如果只有“建房”而没有“拆房”,那么程序就会占用内存越来越多。所以,当使用new 为某个指针分配出内存空间后,一定要记得在不需要再使用时,用delete 删除。下面是一个例子。演示new 和 delete 的对应使用。

 

//建屋和入住:

1) int* p = new int(100);

 

//使用:

2) cout << *p << endl;

 

//拆:

3) delete p;

 

看,第1句,申请了4字节的内存空间,同时存入值为100的整数。

第2句,在屏幕上输出入住者的值 (100)。

第3句,释放内存(这4字节被系统收回准备做其它用途)。入住者呢?自然消失了。

 

前面举的例子都是在 new 一个 int 类型,其它类型也一样:

 

char* a = new char('A');

cout << *a << endl;

*a = 'B';

cout << *a << end;

delete a;

 

bool* b = new bool;

*b = true;

 

if (*b)

cout << "true" << endl;

else

cout << "fale" << endl;

 

但是这些都是简单数据类型,如果要分配数组一样的连续空间,则需要使另一对武器。

 

20.3new [] 和 delete []

 

new / delete 用于分配和释放单个变量的空间,而 new [] / delete[] 则用于分配连续多个变量的存间。

 

20.3.1new[] / delete[] 基本用法

 

new [] 语法:

 

指针变量 =new数据类型[元素个数]

 

语法实例:

 

int* p = new int[20];

 

首先,你需要迅速回想一下,如果是 int* p = new int(20); 那么该是什么作用?否则你很容易在事后把二者混了。

 

实例中,用 new 申请分配了20个连续的整数所需的空间,即:20 * sizeof(int) = 80个字节。

图示为:

(指针变量p指向一段连续的内存空间)

 

new int 只是分配了一个整数的内存空间,而 new int[N]却分配了N个整数的连续空间。看来,new[] 比 new “威力更猛”,所以,我们同样得记得:用 new [] 分配出空间,当不在需要时,必须及时调用 delete [] 来释放。

 

delete [] 语法:

 

delete [] 指针变量;

 

如:

 

//分配了可以存放1000个int的连续内存空间:

int* p = new int[1000];

 

//然后使用这些空间:

……

 

//最后不需要了,及时释放:

delete []p;


分享到:
评论

相关推荐

    C++内存管理详解,new,delete的合理使用

    对应的new和delete要采用相同的形式 下面的语句有什么错? string *stringarray = new string[100]; ... delete stringarray; 一切好象都井然有序——一个new对应着一个delete——然而却隐藏着很大的错误:程序的...

    基于C++的动态内存分配和释放

    cout 对不同情况下的二维数组进行动态内存分配和释放" ; srand((unsigned)time(0)); cout 行数已知为 3 的二维数组" ; int *a1[3],b1[3]; cout 请依次输入该二维数组的列数"; for (int i = 0; i ; i++) { ...

    Malloc和new区别

    3 ,因此C++ 语言需要一个能完成动态内存分配和初始化工作的运算符new ,以一个能完成清理与释放内存工作的运算符delete.注意ne w/delete 不是库函数。 4 ,C++ 程序经常要调用C函数,而C 程序只能用malloc/free ...

    C++动态内存分配(new/new[]和delete/delete[])详解

    主要介绍了C++动态内存分配(new/new[]和delete/delete[])详解的相关资料,需要的朋友可以参考下

    内存分配管理练习

    本程序可作为内存分配和管理练习, 熟悉这个程序并能自己写出代码,说明对c++中内存分配和管理有了一定的了解。 程序说明: 采用一个结构体,保存了数据的个数和使用情况(用一个字节 char类型,字节中八个位若为1...

    详解C++中new运算符和delete运算符的使用

    C++ 支持使用 new 和 delete 运算符动态分配和释放对象。这些运算符为来自称为“自由存储”的池中的对象分配内存。 new 运算符调用特殊函数 operator new,delete 运算符调用特殊函数 operator delete。 在 Visual ...

    控制C++的内存分配

    在嵌入式系统中使用C++的一个常见问题是内存分配,即对new 和 delete 操作符的失控。  具有讽刺意味的是,问题的根源却是C++对内存的管理非常的容易而且安全。具体地说,当一个对象被消除时,它的析构函数能够安全...

    详解C++ 动态内存分配与命名空间

    而C++ new是一个关键字,不管在任意编译器上,任意硬件平台上都是能够进行动态内存分配的,这是本质区别。 malloc是基于字节来进行动态内存分配的,new则是基于类型来进行动态内存分配 // 变量申请: Type * ...

    深入理解C++中的new/delete和malloc/free动态内存管理及区别介绍

    new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理资源。 malloc/free需要手动计算类型大小且返回值类型为void*;new/delete可自动计算类型的大小,返回对应类型的指针。 malloc/free管理内存...

    C++中new与delete、malloc与free应用分析

    new和delete是C++的运算符,用于动态分配内存和释放内存。 1.new表达式 标准库定义了operator new函数的几个重载版本,没有使用noexcept说明的版本在内存分配失败时可能会抛出bad_alloc异常,而使用了的不会抛出异常...

    C++表达式new与delete知识详解

    在C++中,new表达式用于动态创建对象,即在堆(自由存储区)空间上为对象分配内存,而程序员也要小心的使用这些申请来的内存空间,当不再使用时应该调用delete表达式来释放该存储空间并且将指针置零。 本文学习了...

    踏入C++中的雷区C++内存管理详解

    内存分配方式有三种:  (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。  (2)在栈上创建。在执行函数时,函数内局部变量的存储...

    细说C++中的new与delete

    C++中内存的动态分配与管理永远是一个让C++开发者头痛的问题,本文通过对C++中内存的动态分配释放的基本原理的介绍,让读者朋友能对C++中的内存的动态分配与释放有较为深入的理解,从而更好驾驭C++程序。  1. 函数...

    灵巧指针与垃圾回收(Java、C#、C++)

    在JAVA 和 C# 中都有垃圾回收功能,程序员在分配一段内存后可以不再理会,而...因此,一些C++ 书上经常告诫程序员:要养成好的习惯,new 与 delete 要成对出现,时刻记住将内存释放回系统。但是,事情只是这么简单吗?

    c++ 面试 2009

    1.new、delete、malloc、free关系 delete会调用对象的析构函数,和new...因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数

    C++ new分配内存失败 内存碎块

    可以参考内存池的思想,其实nginx的内存分配思想更好,直接分配一大块内 存,进程所需内存在上面再划分,进程结束时再释放内存,对于长期运行的服务很有意义。  换用自己写的内存管理器能一定程度避免这种情况. ...

    Linux-operator-new-delete.rar_Operator Down_VC debug技巧_内存泄漏

    简述 C++ 中的 new 和 delete 的基本原理,并讲述了内存检测子系统的实现原理、实现中的技巧,并对内存泄漏检测的高级话题进行了讨论。解决了本人在内存泄露很多多问题(我也是down的别人的),觉得非常好,所以给...

    C++内存分配与对象构造的分离

    在C++中,我们基本用new(delete)操作符分配(释放)内存。new操作符为特定类型分配内存,并在新分配的内存中构造该类型的一个对象。new表达式自动运行合适的构造函数来初始化每个动态分配的类类型对象。即new表达式...

    C++ new/delete相关知识点详细解析

    C语言用一堆标准库函数malloc和free在自由存储区中分配存储空间,而C++则用new和delete表达式实现相同的功能。 一、new和delete创建和释放动态数组:数组类型的变量有三个重要的限制:数组长度固定,在编译时必须...

    深度探索C++对象模型 chm

     当编译一个C++程序时,计算机的内存被分成了4个区域,一个包括程序的代码,一个包括所有的全局变量,一个是堆栈,还有一个是堆(heap),我们称堆是自由的内存区域,我们可以通过new和delete把对象放在这个区域。...

Global site tag (gtag.js) - Google Analytics