Chinaunix首页 | 论坛 | 博客
  • 博客访问: 823841
  • 博文数量: 137
  • 博客积分: 3477
  • 博客等级: 中校
  • 技术积分: 1409
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-30 21:53
文章分类

全部博文(137)

文章存档

2024年(8)

2023年(10)

2022年(4)

2021年(10)

2020年(9)

2018年(1)

2017年(1)

2014年(4)

2013年(3)

2012年(12)

2011年(24)

2010年(2)

2009年(8)

2008年(6)

2007年(34)

2006年(1)

分类: C/C++

2023-10-24 11:19:08

这次做这个 DataLoader 的 ETL 工具,对于 C/C++ 语言真的是无语了,在 JAVA 中,你可以根本就不用关心你的内存分配,但是在 C/C++ 中,却含有不少暗坑。
话不多说,看例子:

点击(此处)折叠或打开

  1. char str[65535];

  2. bzero(str,65535);

你以为这个是安全的吗?
也许你写一个很小的测试程序去验证,这个代码就是不报错。但是当你的程序中出现了很多这样的类似定义的时候,也许你的程序就 core dump 了。

再看另一个:

点击(此处)折叠或打开

  1. int test(char *s)
  2. {
  3.          s = (char *)malloc(sizeof(char)*65535);
  4.          strcpy(s,"hello c!");
  5.          return 0;
  6. }

  7. int test1 ( void )
  8. {
  9.          char *str;
  10.          test(str);
  11.          printf("%s\n",str);
  12.          return 0;
  13. }

这段代码的问题出在哪里,知道了吗?
如果你连续的调用 test1 函数,那么恭喜你,在你不确定的地方,你的程序将再次 core dump .

我们再来看第三段代码:

点击(此处)折叠或打开

  1. int test ()
  2. {
  3.         char *str;
  4.         free(str);
  5. }

在某些环境下,你的程序将直接 code dump 。

总结:
画重点==============
1、不管在任何时候,当你需要分配一个大的内存空间时,千万不要想着定义一个静态的数组变量,这不是一个好的做法,当你需要分配一个大的内存空间的时候,建议你定义一个指针,然后采用 malloc 函数对这个指针进行内存分配。
2、在某些特定的时候,你需要在主函数中定义指针,在调用的子函数中进行内存分配,赋值并返回,切记,在使用完成后,你应该在主函数中使用 free 函数进行内存释放,千万不要认为是在你的子函数中进行的内存分配就可以置之不理。要知道你定义的这个指针变量的生命周期是由这个主函数决定的,虽然它的内存是在子函数中分配的,你依然需要在主函数中对其内存进行释放。
3、任何时候,如果你定义了一个指针,当没有对其使用 malloc 进行内存空间分配的时候,切记不可调用 free 函数对其进行内存释放操作,这会带来不可预知的错误。
阅读(269) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~