动态分配使用不当会造成内存泄漏,这里分享一个最容易被忽略的内存泄漏现象。
#include <iostream>
char * func(void);
int
main(){
char *pm = NULL;
pm = func();
/*
** Do something
*/
return 0;
}
char *
func(void){
char * p = (char *)calloc(10, sizeof(char));
if (p == NULL)
exit(EXIT_FAILURE);
/*
** Do something
*/
return p;
}
这里func函数中动态分配了一段内存,并且返回一段数据存放在的动态分配的内存中。
当func()返回时,用一个指针pm接收返回的数据,但是我们通常会忘记,pm(原p)指向的内存是动态分配的,用完pm后没有
free(pm)导致内存泄漏。
这里还遇到一个有趣的问题:
#include <iostream>
#include <cstring>
void func(char* p)
{
p = (char*)calloc(20, sizeof(char));
if (p == NULL)
exit(EXIT_FAILURE);
}
int main()
{
char *str = NULL;
func(str);
strcpy(str, "New String");
std::cout << str << std::endl;
system("pause");
return 0;
}
这段程序到了strcpy处会报错。
实际分析一下,在执行func()处,是传值调用!!!
传递给func中p的是str的值,也就是一个地址;
当在func()中进行动态分配时,p中的值被动态分配的地址替换调,但是注意str中的地址还是原地址;
还是str还是原先的char * 指针,所以strcpy会出错(内存覆盖);