![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
c++动态分配内存后,用for循环可是总是出错。
经过仔细研究发现,循环次数比较少的时候可以吗,多的时候就会出错,又单独建立文件专门试验这个问题发现就不会出错。求教牛人是哪里出错了?string*wordsp=newst...
经过仔细研究发现,循环次数比较少的时候可以吗,多的时候就会出错,又单独建立文件专门试验这个问题发现就不会出错。求教牛人是哪里出错了?
string *wordsp=new string[456192];
for(i=0;i<456192;i++){*(wordsp+i)="mmm";}
上面出错,但是把其中的456192改为92可运行。单独建立文件也不会出错。前面也只是简单的处理,不过也有涉及动态分配内存,而且是最后才释放。
*(wordsp+papernum*y*z-1)="sss";//这个就可以运行。 展开
string *wordsp=new string[456192];
for(i=0;i<456192;i++){*(wordsp+i)="mmm";}
上面出错,但是把其中的456192改为92可运行。单独建立文件也不会出错。前面也只是简单的处理,不过也有涉及动态分配内存,而且是最后才释放。
*(wordsp+papernum*y*z-1)="sss";//这个就可以运行。 展开
3个回答
展开全部
很显然问题在于内存不够
类的指针的new分配是要占用堆栈的。如此多的数据可能会造成动态内存分配的异常中的内存不足。
类的指针的new分配是要占用堆栈的。如此多的数据可能会造成动态内存分配的异常中的内存不足。
追问
那这样的问题应该怎么解决才能处理这样的数据啊?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
string对象占字32节,赋值时最少申请16字节
(32+16)*456192 也就是20M的内存开销, 不是很可怕.
这段代码不该出错, 不知楼主用的什么系统.
我试了VC6和VC2005, 正常运行.
(32+16)*456192 也就是20M的内存开销, 不是很可怕.
这段代码不该出错, 不知楼主用的什么系统.
我试了VC6和VC2005, 正常运行.
追问
我用的是devc++,我还用了一些其他的变量,会不会整个程序比较大,你能帮我看看吗?我qq391198703.如果解决了我给你高分哈。多谢多谢呀!~
追答
不好意思, 我没有DEV环境帮不了你了.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
请问出的是什么错,可否把错误信息列出?
还有,如果你的i定义的是int,那456192已经超出了它的最大值:32767,再进行加1运算,就会溢出,肯定要出错的。
还有,如果你的i定义的是int,那456192已经超出了它的最大值:32767,再进行加1运算,就会溢出,肯定要出错的。
更多追问追答
追问
我定义的是long int。不知道是不是还是i不够用?
追答
那应该不会是数据类型的问题了。long int完全足够。你可以看看是不是因为数组下标溢出的错误。我看你其中用的是这个赋值*(wordsp+i)="mmm";这样当i=456191时,你的操作下标已经超出456192了,这样会引起非法操作。
你可以把
*(wordsp+i)="mmm"改成*(wordsp+i)="m";测试一下,或是把循环条件控制在456189之下,如果不出错,主可以断定是数组操作超出下标的问题引起。至于为什么单独建一个文件不会出错,可能的问题是在单独建文件,下标操作溢出后,没有影响到重要的数据,所以不会出错,而在原来的程序中,正好溢出后,影响到了重要数据,所以会出错。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询