永发信息网

new分配的内存块里面怎么会有数据?

答案:2  悬赏:40  手机版
解决时间 2021-02-20 18:08
  • 提问者网友:最爱你的唇
  • 2021-02-19 23:43
char *p;
p = new char[100];
为什么此时p里面已经有数据?而且数据的内存大小超出了我分配的内存大小?
最佳答案
  • 五星知识达人网友:夜风逐马
  • 2021-02-20 00:08
首先明确一点:数据存在和有意义是两回事。你可以随意将一块内存填充为任意值,但是这个值不具有意义。

new的操作是这样的:首先分配一块内存给你,接着根据编译器的不同,有的会把这块内存写成0,然后返回内存首地址;有的什么都不做,直接返回给你首地址。前者可以认为没有数据的,或者是数据为0;而后者则要看这块内存之前是否被其他人用过,如果用过则不一定是0,就相当于你说的有数据,但是这个数据对你来讲是无意义的(除非你确切的知道其他程序对这块内存做了什么操作)。

至于为何数据内存大小超出了分配大小,我不是很清楚你是如何计算数据的内存大小的,不过这种情况从逻辑层面来讲是不可能发生的,也就是说你无论使用语言提供的何种内存计算方式来计算都是一致的。(从内存实际分配的物理层面来讲是有可能的,但是很少见)
全部回答
  • 1楼网友:北方的南先生
  • 2021-02-20 01:48
据我所知,c语言里是没有用于动态内存管理的关键字的。最常用的malloc,free等均是库函数。而在标准上,c++是兼容c的,也就是c的库函数在c++中依然可以正常使用。这样的话c++的设计者就没有足够的理由来为c++再重新开发一些用于内存动态管理的库函数。 但是c++却将开辟删除内存空间作为关键字出现,其主要原因是因为c++是一个面向对象的语言,new和delete关系着类对象的构造、析构函数的自动调用。故而在c++中用习惯上已不在使用malloc等库函数管理内存空间,当然更不能将new与free或者malloc与delete混用。 对于您的问题,个人认为既然是在c++环境中,大可使用一些c++所提供的便利。如果只是需要对字符数组进行操作管理的话,使用string类就可以了,只需要简单的几部交换。甚至在一些类库中,如mfc中的cstring类,字符数组的空间管理几乎时透明的。如果是一些类似于像网络通讯时缓冲区的管理等要求时,可以编写一个自己的类,在以后用到的时候就不用在重新编写代码了,直接引入类就行了。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯