C++程序内存问题

来源:互联网 发布:2016万方数据库免费 编辑:程序博客网 时间:2024/05/18 15:07

C++的指针为我们带来了方便,但也带来了程序调试中的困难。

如果不用指针,程序出错地方容易定位,修改起来很容易,比如java中的数组越界,会有很明确的提示。在C++中如果数据越界,它可能导致另一个数组不能正常使用,从而导致访问冲突。
比如,笔者程序中的一段代码:
int data[500];
char str[10000];
while(fin.getline(str, 10000))
{
     /*
      把str中的数字分开,存储在data中.
      比如:str="1232|23432|123|4545|3435|43535"
      那么处理结果就是把data[]={1232,23432,123,4545,3435,43535}
     */
}
在之前的数据处理中程序没有一点问题,可是到后来处理就出现了问题,当fin.getline(str,10000)读取某一行数据时,程序中断,提示“*****:访问冲突”,只是知道现在str的长度,比以前要长很多,于是有了错误推断:getline一次接受的字符个数有上限。可是翻了资料,认真地看了C++中getline的实现,发现没有!无奈。。。。于是写了个小程序,对文件不做复杂处理,只是将文件中的字符读入,写入到另一个文件中,程序没有任何中断,顺利执行完毕,证明我的推断确实是错误的。
后来,忽然想起data数组可能在str长度变长时,出现越界,于是就把data的长度设为10000,也就是代码修改为:
int data[10000];
char str[10000];
while(fin.getline(str, 10000))
{
     /*
      把str中的数字分开,存储在data中.
      比如:str="1232|23432|123|4545|3435|43535"
      那么处理结果就是把data[]={1232,23432,123,4545,3435,43535}
     */
}
程序顺利执行,正常输出结果。
C++的访问冲突,多半儿是因为数组或动态申请空间造成。
还有容易出现错误的就是memset。这个函数一般用来对数组或动态申请的空间做清零处理,但是清零的长度设置要注意,否则也容易出现意想不到的错误。