C++内存分配问题

#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>usingnamespacestd... #include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>

using namespace std;
int main(){
unsigned int MAX = (unsigned int)(1 << 31);
unsigned int size = MAX >> 5;
int *bit1 = (int *)malloc(size + 1);
if(bit1 == NULL){
cerr<<"Malloc error!"<<endl;
exit(1);
}

memset(bit1, 0, size);

cout<<size<<"\t"<<bit1[size]<<endl;
return 0;
}

不是在malloc函数里面已经分配了size+1个int空间吗?怎么引用bit1[size]出错了?
出的错是内存泄漏。
展开
 我来答
望穿秋水待伊人
2012-03-23 · TA获得超过644个赞
知道小有建树答主
回答量:708
采纳率:100%
帮助的人:804万
展开全部
首先,第一个错误是,你只初始化了memset(bit1, 0, size); size个空间,而引用 了size+1个位置,也就是引用 了未经初始化的值,这是C++里不允许的。
要改成 memset(bit1, 0, size+1);
第二个可能引发错误的原因是,unsigned int MAX = (unsigned int)(1 << 31);
unsigned int size = MAX >> 5;,这儿运行结束,size的大小是67108864,这儿是int型 ,也就是要用到 4*67108864 B 内存空间,如果电脑空闲内存不足的话,也是会报错的。
第三个错误是,分配了内存却没有进行释放,会造成内存泻漏,这是很危险的。
追问
错误原因我找到了。你的第一个建议是错的,memset并不是初始化,它的作用是清零。不需要这句话那个程序也是可以运行的。第二个建议你说的对,但是我电脑内存够,我也知道我分配了很大的内存给程序。第三个这个程序是小的,在程序结束的时候内存会自动释放,但是加上你的建议更好。
追答
memset的作用是用指定字符填充指定的内存区域,作用就是初始化,只有过大多数时候都用0来初始化值而已,可并不是只用来清零的,如果不用这一句,分配的内存区域内的值可能 是未知的,看似没有也可以运行,但其实是必须的,不然你的程序可能 某些时候出现一些不可预料的错误 。

错误的原因是size+1 B 空间,只能存放 size/4个整数,所以不能用 bit1[size],是这会事吧
congqian11919
2012-03-23
知道答主
回答量:22
采纳率:0%
帮助的人:13.1万
展开全部
你出的错,是不是内容获取不对?
你只复制了size个0到bit1里面【memset(bit1, 0, size)】,而你现在cout<<size<<"\t"<<bit1[size]<<endl要获取的却是:bit1[size]。也就是第size+1个值,这个里面根本没有分配内容,怎么能被输出呢。你懂了没?
追问
内存泄漏
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式