最近在使用QT开发一个大型项目,内存占用可能有点多,其中在vector.push_back()的时候报了一个segment fault错误,感到很奇怪。
因为平时遇到段错误,大多数情况下都是数组越界(使用[]访问元素),而vector的push_back()函数,在添加元素时,如果空间不足,会先向内存申请原来空间的两倍大小的新的空间,然后把原来空间的元素拷贝到新空间。
所以这个时候问题就定位到了申请新空间这个步骤上,如果系统没有更多的内存可供申请了呢?那么就会报段错误。而我们知道堆内存有2-3G,一般都不会占满堆内存。什么时候会占满堆内存呢?有一种内存错误会导致这种情况发生,那就是内存泄漏!!!内存泄漏一般发生在使用new申请了内存空间,但是没有使用delete释放,因此会导致内存泄漏,不断膨胀。
所以要谨记《Effective C++》中提到的,new和delete要配对使用,如果允许的话,尽量多使用智能指针。