关于内存泄漏的几个问题
1函数返回值为指针
1.1错误例子:
#include <iostream>
#include <stdlib.h>
using namespace std;
int *func1(void)
{
int *a;
*a=10;
return a;
}
int *func2(void)
{
int a=10;
return &a;
}
int main()
{
int *x;
x=func1();
cout<<*x<<endl;
x=func2();
cout<<*x<<endl;
return 0;
}
程序运行的结果:
10
10
虽然本次运行结果是对的,但是这两个函数都存在一定的问题:
函数1:代码int *a;
会为变量a分配一个内存,a中存放一个指针,但是指针是随机的指向一个非空的内存的;直接对指针指向的数据进行修改会有很大的危害;一般定义一个空指针的形式为int *a=NULL;
函数2:代码int a=10;
会为变量a分配一个内存,a中存的数据为10,函数结束后会将给a分配的内存释放掉,虽然暂时其中的数据为改变,但是这块内存是无主的,可以被分配给其他的变量,内存中的数据可能在其他情况下被改变,虽将此地址返回,其内容是不定的;
1.2正确确的例子
如果是无输入的函数返回一个指针,可以采用如下的形式:
#include <iostream>
#include <stdlib.h>
using namespace std;
int *func(void)
{
int *a=NULL;
a = (int *)malloc(sizeof(int));
*a=10;
return a;
}
int main()
{
int *x;
x=func();
cout<<*x<<endl;
free(x);
return 0;
}
其中需要注意的点在于malloc()函数分配了内存,如果这块内存不再需要使用,要使用free()函数释放掉,否则也会导致内存泄漏;