永发信息网

c++ new 内存不够(抛出bad_alloc异常)怎么解决?

答案:2  悬赏:0  手机版
解决时间 2021-11-24 08:19
c++ new 内存不够(抛出bad_alloc异常)怎么解决?
最佳答案
//重载输入流操作(>>)
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()每次获取一位。
全部回答
目测这段代码有内存泄漏

另实际应用还是用标准库的 string 为好,无需自己实现追问我只是想练一下手
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
上海泰洁干洗连锁地址在什么地方,想过去办事
如何练习黑嗓?
粉皮怎么吃好吃粉皮能凉拌吗怎么做
重庆市永川区南瓜山水库怎么走?
中国移动(天脉手机指定专营店)地址在什么地方
20100一直加到1是多少?
藤椅的竹藤原件是什么?不是竹子吧?还是别的
同学结婚上礼问题
李思思是北京大学的吗?
上头草头,下面预备的预,怎么念
0.75x-0.40乘10等于2
求助,厦华LC-46HU27(已修复)
男导师经常和我(美女硕士)一起吃饭,别人会
超霸电池怎么样
高考志愿签字确认是什么意思
推荐资讯
一公斤野西瓜要用几公斤白酒泡啊
祥福路地址在什么地方,想过去办事
月字加个辰字是什么字
高铁东莞站到下桥站地铁
中和付APP好不好用,有没有用过他们的呢
娄底至张家界好走嘛,都是高速嘛
女主叫燕羽儿的言情小说是什么小说
gb1230的平垫外径22是多少
在公司上班七年,月收入平均工资4500,公司现
成都业之峰装饰公司怎么样谁说说
茶韵阁地址在哪,我要去那里办事,
为什么中国爸妈养孩子很累
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?