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]出错了?
出的错是内存泄漏。 展开
#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]出错了?
出的错是内存泄漏。 展开
2个回答
展开全部
首先,第一个错误是,你只初始化了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(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],是这会事吧
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询