您的位置:首页 > 编程语言 > C语言/C++

C++程序内存问题

2012-04-24 19:23 323 查看
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。这个函数一般用来对数组或动态申请的空间做清零处理,但是清零的长度设置要注意,否则也容易出现意想不到的错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: