降低内存的占用
1.慎用erase()
昨天我运行了一个数据,在对字符串的处理时使用了迭代器来对string对象进行遍历,并用string.erase()进行字符串的裁剪。这种办法对于少量数据来说是完全没问题的,但是一到大量数据,就会提示内存不足,甚至电脑性能不高的话,主板会被烧坏。(别问我怎么知道的o( ̄︶ ̄)o)
出现这种情况的原因是erase对字符串(数组同理)进行擦除后,迭代器指向的是被删除的元素的下一个,而被删除的元素虽然在字符串中消失了,但是它的地址没有被释放掉,出现了野指针和内存泄漏。(自己的拙见,欢迎指导)
虽然已经找到了效率更高的办法可以不用erase,其实就是直接用find,substr就行。但是经过昨天对迭代器进行大量的研究之后,找到了以上情况的解决方案:判断迭代器所指的位置是否是字符串的开头,若不是,迭代器前移一位。
以下面的函数为例,我想去除字符串中的‘\”‘,注意:它是一个转义字符,表示双引号的一半。
原代码:
void charErase(string &str)
{
string::iterator it;
for (it = str.begin();it!=str.end();it++)
{
if(*it == '\"' )
{
it = str.erase(it);
if(it == str.end())
break;
}
}
}
加个判定条件:
if(it!=str.begin())
{
it--;
continue;
}
改进后的完整代码:
void charErase(string &str)
{
string::iterator it;
for (it = str.begin();it!=str.end();it++)
{
if(*it == '\"' )
{
it = str.erase(it);
if(it!=str.begin())
{
it--;
continue;
}
if(it == str.end())
break;
}
}
}
还是不推荐用,尤其是对于处理的字符串不算长,用find和substr的效率比迭代器高。
2.释放指针后还要将指针置为空
若不置为空,那个地址还是占用着的。
free(p);
p = NULL;
3.少用公共变量,若必须用,也要及时释放
如数组vector,作为局部变量时会自动释放空间,但若作为公共变量,就会一直占用内存空间直至程序运行结束。有时候,我们虽然将其设为公共变量,但也不代表其从始至终一直有用。因此,可以选在在析构函数中释放数组的空间。
vector<数组中元素的类型>().swap(数组名);
4.不要新建多余的变量,尤其是数组等很占空间的
(1)如读文件,读一遍能解决就不要让它读两遍,费空间费时间。引申而得,我们平时在写完代码时候,要理几遍逻辑,有时虽然功能实现了,但是却做了很多无用的工作。
(2)类内定义的属性在函数中直接赋值即可,不必要在函数中新建一个相同类型的对象,再传给类内属性。这样会占用双倍空间。对于大数据量非常不友好。当然前提是该方法是类内的方法或者函数参数中有类对象。
5.多用地址传递,少用值传递。