new和delete3

想弄懂这个问题,首先你要弄清楚数据的3种存储方式。

1。静态区:全局变量。

2。堆:程序执行是分配的内存

3。栈:函数调用,局部变量。

new出来的内存就是分配到堆上的。程序执行完以后,上分配的内存不会被操作系统自动回收,所以你不delete掉的话,操作系统不回收,那块内存就成了没爹没娘的无业有民了,这个就叫内存泄露。

我这样说你应该知道为什么书上为什么说newdelete要成对出现了吧。分配出来的内存记得自己回收掉。

静态区和栈上面分配的内存操作系统会自动回收。所以不用delete了。

另外,我觉得你好像没有搞清楚new出来了什么东西,delete掉了什么东西。我给你举例子说。

int * pt//声明了一个pt指针,四个字节,放在栈里面的

pt = new int;// new了一个int形的数据放在堆里面,再把这个数据的地址赋给pt

这句话的意思是你先声明了一个pt指针,四个字节,放在栈里面的,然后你new了一个int形的数据放在堆里面,再把这个数据的地址赋给pt

delete pt

这个就是把pt指向的地址所占的内存释放掉。其实释放的就是堆上面的那个int。然后你的pt还是存在的,还在栈里面。不过你查它的值时,变成了null

这样说懂了吧。

其实你程序里面的del是在别的地方new了。

就比如:

int * A()

{

int *pt = new int;

return pt;

}

main()

{

int * ptMain;

ptMain = A();

delete ptMain;

}

这样一个过程,就像你给出的例子了。

不过,我们编程的时候尽量 谁new的谁delete,尽量避免内存泄露。
C++方式的内存分配与释放newdelete
在内存管理上,C++C有着完全不同的两套方案。当然,C++的总是同时兼容CC的那一套方案在C++里同样可行。 我们首先看看纯C++的那一套:newdelete

new,从字面上看意思为;而delete字面意思为删除。二者在C++中内存管理中大致的功能,应是一个为新建,一个为删除
20.2.1new
newc++的一个关键字。被当作像+-*/一样的操作符。它的操作结果是在申请到一段指定数据类型大小的内存。

语法:

指针变量= 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.2new时初始化内存的值
new也可以在申请内存空间时,直接设置该段内存里要放点什么.

语法:

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

这样,上例可以改为:

int p = new int(100)*;

cout << *p << endl;

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

char pchar = new char('A');
20.2.3
delete*
语法:

delete指针变量;

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

举例:

int* p;

p = new int;

*p = 100;

cout << *p << endl;

delete p;

system("PAUSE");

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

第一步:

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

(newdelete)

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

第二步:

接下来我们来观察指针变量被delete之后,所指向的内存会是什么。但,这是一件犯了CC++编程大忌的事:访问一个已经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.5newdelete的关系
如果只有建房而没有拆房,那么程序就会占用内存越来越多。所以,当使用new为某个指针分配出内存空间后,一定要记得在不需要再使用时,用delete删除。下面是一个例子。演示newdelete的对应使用。

//建屋和入住:

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 []指针变量;

如:

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

int* p = new int[1000];

//然后使用这些空间:

……

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

delete[]p;
原文链接: https://www.cnblogs.com/BloodAndBone/archive/2011/02/18/1957784.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/21165

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午11:11
下一篇 2023年2月7日 下午11:12

相关推荐