c++ new 内存不够(抛出bad_alloc异常)怎么解决?
答案:2 悬赏:0 手机版
解决时间 2021-11-24 08:19
- 提问者网友:蔚蓝的太阳
- 2021-11-24 01:13
c++ new 内存不够(抛出bad_alloc异常)怎么解决?
最佳答案
- 五星知识达人网友:一秋
- 2021-11-24 02:23
//重载输入流操作(>>)
istream& operator>> (istream& is, String &other)
{
//预分配100个空间
char *str = (char *)malloc(sizeof(char)*100);
char *buf = str;
int i = 1;
//预处理:跳过流里面的所有空格和回车
while ((*buf = getchar()) == ' ' || (*buf == '
'));
for ( ; ; ++i)
{
if (*buf == '
') //回车跳出
{
*buf = '';
break;
}
else if (*buf == ' ') //空格跳出
{
*buf = '';
break;
}
else if (i % 100 == 0) //空间不足
{
i += 100; //追加100个空间
str = (char *)realloc(str,i);
}
else //每次getchar()一个值
{
buf = (str+i);//为了避免realloc返回首地址改变,不使用++buf,而是用str加上偏移.
//每次读取一个字符
*buf = getchar();
}
}
//至此:输入完成
//我原本已经重载了=号
other = str; //拷贝:将临时开辟空间里头的数据,拷贝如字符串中
free(str); //释放临时开辟的空间
str = NULL;
buf = NULL;
return is;
}这是我看了VS2010里面string,动态输入实现原理仿照写的一个。
它主要是先预开辟一段空间,然后一直是按照每次追加一个字符的原理输入,你可以看一下VS2010里面的源码,如下图:
追问我觉得这里不能用getchar(),要用istream& is,否则返回的是空的追答这里的返回值只是用于连续输入,就是cin>>a>>b类型。
你用istream &is就相当于是用cin>>输入,你现在本来是要开辟空间,但是却不知道要开辟多大的空间,就是因为要避免cin>>才用每次在后面追加一位的机制,才引入了getchar()来解决,当然你也可以用cin.get()每次获取一位。
istream& operator>> (istream& is, String &other)
{
//预分配100个空间
char *str = (char *)malloc(sizeof(char)*100);
char *buf = str;
int i = 1;
//预处理:跳过流里面的所有空格和回车
while ((*buf = getchar()) == ' ' || (*buf == '
'));
for ( ; ; ++i)
{
if (*buf == '
') //回车跳出
{
*buf = '';
break;
}
else if (*buf == ' ') //空格跳出
{
*buf = '';
break;
}
else if (i % 100 == 0) //空间不足
{
i += 100; //追加100个空间
str = (char *)realloc(str,i);
}
else //每次getchar()一个值
{
buf = (str+i);//为了避免realloc返回首地址改变,不使用++buf,而是用str加上偏移.
//每次读取一个字符
*buf = getchar();
}
}
//至此:输入完成
//我原本已经重载了=号
other = str; //拷贝:将临时开辟空间里头的数据,拷贝如字符串中
free(str); //释放临时开辟的空间
str = NULL;
buf = NULL;
return is;
}这是我看了VS2010里面string,动态输入实现原理仿照写的一个。
它主要是先预开辟一段空间,然后一直是按照每次追加一个字符的原理输入,你可以看一下VS2010里面的源码,如下图:
追问我觉得这里不能用getchar(),要用istream& is,否则返回的是空的追答这里的返回值只是用于连续输入,就是cin>>a>>b类型。
你用istream &is就相当于是用cin>>输入,你现在本来是要开辟空间,但是却不知道要开辟多大的空间,就是因为要避免cin>>才用每次在后面追加一位的机制,才引入了getchar()来解决,当然你也可以用cin.get()每次获取一位。
全部回答
- 1楼网友:醉吻情书
- 2021-11-24 03:07
目测这段代码有内存泄漏
另实际应用还是用标准库的 string 为好,无需自己实现追问我只是想练一下手
另实际应用还是用标准库的 string 为好,无需自己实现追问我只是想练一下手
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯