C++学习过程中经常会碰到一些关于元素的插入与删除。就容器而言,在容器对象中insert或者压入一个元素时,该对象大小会增加1。在分析容器与数组区别的时候,网友提出了,数组的大小是指定的,而容器的大小动态的。当时我也思考到,new和delete也是动态的创建数组的,这又该怎么解释呢?于是我把教材中关于new和delete的内容再搬过来,再来看看,new什么?delete什么?new有什么好处?
1:动态数组中的那些事儿
枯燥的看下了解下数组吧:数组类型的变量有三个重要的限制:1)数组长度固定不变;2)编译时必须知道其长度;3)数组在定义它的语句块内存在
大致上明白了一点:就是长度我得知道,在哪部分定义的,就用在哪部分。
BUT:这样的限制也太坑爹了吧,我编写了个程序。然后用到了数组,比如说高一的时候大家没分科,都在一起学习,有40个人。到高二了涉及到分科了,这时候呢有些人去学文科了,有些人去学理科了。对这个班来说我要保留理科班的性质,学文科的可以离开,一些别的班的学理科的也可以进来。但是怎么办呢?我只有40个位置,这时候进来学理科的比出去学文科的人多。我不能不给他们分配位置啊。但是我只有40个位置啊?好吧,我们得想个办法解决它。
这样可不可以?我们先不管它有多少个人,反正最后我都让它有位置坐,有41个人我给它41个位置,有50个我给它50个位置。反正我们安排(编译)的时候不管他多少人,只有等我们上课(运行)的时候再确定他有多少人。这样的人数我们会一直存在着(动态数组一直存在),只有等到毕业的时候,才把这个班级拆掉。(直到程序显示释放为止)。
一样的道理,跟数组一样,我们得定义它,还要初始化它。
最后分班的时候我们只要知道它是理科班还是文科班(类型)和这个班有多少人(长度)即可。
定义:int *pia = new int[40]; //我们创建了一个有40(长度)个人的理科班(类型),是由pia(指针)来当班主任。
但是我new了一个班级,那我返回什么呢?我得给我这个班有一个标识吧。那就用学霸来标识吧,班主任一般都比较喜欢第一名,那就指向第一名吧。(数组的第一个元素)
初始化:怎么初始化?一般的在C++的学习中都会涉及到类类型和内置类型。
因此在动态的数组中初始化中,类类型就是用该类的默认构造函数初始化,如果是内置类型就不初始化。
当我们毕业时。。。。。。
你们班用了3年了,要毕业了,你毕业了不能还想把这个班级占着吧,你得清空吧。那你就得释放它。都想你这样天天占着一个班,那学校早得炸了(内存逐渐耗尽)。
怎么释放呢?-------把你们班主任干掉!!!!
操作:
delete [] pia; //班主任pia终于把你们带毕业了,它也得把你们清空了。
2、我希望new一个对象,然后不再delete她
文学家可以用很华丽的文字来表达对心爱之人的爱慕之情,但是码农也可以浪漫。你可以再Linux中写一个脚本,然后编译进内核。当她每一次开机的时候,你得情书就能华丽丽的在屏幕上跳动着她的华尔兹。但是尼玛,这也得是女码农才会用Linux啊。好吧,在没有对象之前,我们就只能先YY了,自己创造一个对象(new)。
联想到数组的new,我们知道我想要一个对象,这个对象首先是个女的(类型),没了!恩!就是没了!!! 屌丝在没有女朋友之前,要求哪有那么高,女的就行。
好吧,让我们来定义吧。
girl *me = new girl ;//一个姑娘就有了,这个姑娘是女的,是me要的女的,就是一个girl类型的,我所指向的女的。
返回的是什么?返回的肯定是我这个指针啊,都说了是我指向的。
其实呢?我还是想 多知道点这个姑娘的一些信息。比如名字?身高?那就给她赋点东西,虽然她可能会改名,也有可能会长高。但我猜她是不会变性的。
初始化:
girl *me = new girl (165);//好吧,这个姑娘有165的身高。这是她现在的身高!!!
当然了你也可以不自个给她附一些东西,因为有些东西天然的会给她附加的(默认构造函数)
恋爱中的人是疯狂的,突然有一天你发现再这么折腾下去,你精力都要被耗尽了(耗尽内存)。你就想分手了。
那你就赶紧把她给删了吧,电话本里也别留,什么都别留。
delete me; //我靠,不是删除它嘛,干嘛delete me啊?谁叫你跟人家纠缠呢?爱,最后一次有点关系吧。
总结一下:基本上我记录的笔记都没有讨论const的情况,这种情况其实也是大同小异,把教材当个工具书,你编写代码的时候突然想用const了,就去查吧。这样效率更高。
3:C++中有了malloc/free,为什么还需要new/delete?
malloc/free是C++/C语言的标准库函数,new/delete是C++运算符。它们都可用于申请动态内存和释放内存。
对于非内部数据类型的对象而言,只用malloc/free无法满足动态对象的要求。