前言
本文主要介绍C++内存泄漏,代码实现
一、内存泄漏是什么?
内存泄漏是一件每次可怕的事情,在平时的C++编程中,如果不注意内存的分配与回收,可能没有什么,但一旦在实际项目里面,发生这个,那么就会发生意想不到的事情啦。
我们在使用new操作符的时候,会给指针分配一块内存空间,但是如果不注意delete,长此以往那么就会发生内存泄漏啦
二、代码测试
1.发生内存泄漏的代码
代码如下(示例):
#include <iostream>
#include <vector>
using namespace std;
class A{
char *s;
public:
A(){
}
A(int len){
s = new char[len];
s[0]='s';
s[1]='b';
}
char* getS(){
return s;
}
};
char *s;
void test(){
A* a =new A(10000000);
s = a->getS();
}
int main(){
int i=1;
while(1){
test();
cout<<s<<i++<<endl;
}
return 0;
}
可以看到,有一个A类,里面有一个指针,在其构造函数中,进行new操作为其分配空间。但是我没有写析构函数,进行对其的内存回收。顺便为了校验一下,一个局部函数里面的类的对象,会不会对已经分配好的内存空间自动进行回收。如果会收回,那么cout<<s<<i++<<endl;这句代码的效果是只有输出i的值的。
下面看看结果
显然,内存不会被自动回收。这也正是解释了为什么会有内存泄漏。因为持续分配空间出去,而不回收,空间总有用完的那一天。
在连续进行2492次分配1000,0000字节操作后,内存被我分配完啦,爆辣。
2.防止内存泄漏
在析构函数中使用delete语句(还有一种用法是delete[]这里不作具体介绍)
代码如下:
#include <iostream>
#include <vector>
using namespace std;
class A{
char *s;
public:
A(){
}
A(int len){
s = new char[len];
s[0]='s';
s[1]='b';
}
char* getS(){
return s;
}
~A(){
delete s;
}
};
char *s;
void test(){
A* a =new A(10000000);
s = a->getS();
}
void test2(){
A a(10000000);
s = a.getS();
}
int main(){
int i=1;
while(1){
test2();
cout<<i++<<endl;
}
return 0;
}
可以看到,运行四万多次都不会内存泄漏。
总结
用来new 就必须要有delete