这次做这个 DataLoader 的 ETL 工具,对于 C/C++ 语言真的是无语了,在 JAVA 中,你可以根本就不用关心你的内存分配,但是在 C/C++ 中,却含有不少暗坑。
话不多说,看例子:
-
char str[65535];
-
-
bzero(str,65535);
你以为这个是安全的吗?
也许你写一个很小的测试程序去验证,这个代码就是不报错。但是当你的程序中出现了很多这样的类似定义的时候,也许你的程序就 core dump 了。
再看另一个:
-
int test(char *s)
-
{
-
s = (char *)malloc(sizeof(char)*65535);
-
strcpy(s,"hello c!");
-
return 0;
-
}
-
-
int test1 ( void )
-
{
-
char *str;
-
test(str);
-
printf("%s\n",str);
-
return 0;
-
}
这段代码的问题出在哪里,知道了吗?
如果你连续的调用 test1 函数,那么恭喜你,在你不确定的地方,你的程序将再次 core dump .
我们再来看第三段代码:
-
int test ()
-
{
-
char *str;
-
free(str);
-
}
在某些环境下,你的程序将直接 code dump 。
总结:
画重点==============
1、不管在任何时候,当你需要分配一个大的内存空间时,千万不要想着定义一个静态的数组变量,这不是一个好的做法,当你需要分配一个大的内存空间的时候,建议你定义一个指针,然后采用 malloc 函数对这个指针进行内存分配。
2、在某些特定的时候,你需要在主函数中定义指针,在调用的子函数中进行内存分配,赋值并返回,切记,在使用完成后,你应该在主函数中使用 free 函数进行内存释放,千万不要认为是在你的子函数中进行的内存分配就可以置之不理。要知道你定义的这个指针变量的生命周期是由这个主函数决定的,虽然它的内存是在子函数中分配的,你依然需要在主函数中对其内存进行释放。
3、任何时候,如果你定义了一个指针,当没有对其使用 malloc 进行内存空间分配的时候,切记不可调用 free 函数对其进行内存释放操作,这会带来不可预知的错误。
阅读(278) | 评论(0) | 转发(0) |