编写安全代码。真的每次都检查分配错误吗?

问题描述:

我写了一个3维C实现的Game of Life by John Conway。现在,我想让代码安全的出错。 This来自yolinux.com的文章说编写安全代码。真的每次都检查分配错误吗?

检查内存分配错误。如果未分配,则无法释放它。

我的问题是,我真的应该每次检查分配错误吗?这可能会大大减慢我的代码。下面是摘录:

inline int golField_Init(golField* field, golAllocProc alloc, 
         golOptions options, uint dimx, uint dimy, uint dimz) { 
    field->dimx = dimx; 
    field->dimy = dimy; 
    field->dimz = dimz; 
    field->cells = alloc(sizeof(golCell**) * dimx); 
    field->options = options; 

    if (!field->cells) return 1; 

    int x, y, z; 
    for (x = 0; x < dimx; ++x) { 
     field->cells[x] = alloc(sizeof(golCell*) * dimy); 
     for (y = 0; y < dimy; ++y) { 
      field->cells[x][y] = alloc(sizeof(golCell) * dimz); 
      for (z = 0; z < dimz; ++z) { 
       golCell_Init(&field->cells[x][y][z], 0); 
      } 
     } 
    } 

    return 0; 
} 

如果我真的检查每个分配分配错误?这也需要我释放已分配的存储空间。

+3

检查指针是否为空是令人眼花缭乱的快速上任何现代的CPU。 – 2012-03-11 21:11:41

+2

建议 - 你可以考虑预先做一个单独的数组分配,所以你不必为每一行/每列做一个数组。这就是“field-> cells = malloc(sizeof(golCell)* dimx * dimy * dimz)” – selbie 2012-03-12 04:50:45

+0

selbie:这就是我在做n维时所做的,但这很复杂。然后,我从上面提出了“3d代码”,然后,在阅读答案后,用一种复杂的方式创建一个3D数组,但分配了3个步骤的存储空间,最后我现在处于您建议的位置, 哈。 xD对于任何搜索访问和元素线性映射的伪3D数组的方法:#define GOL_3DTOLINEAR(x,y,z,dx,dy,dz)((z)+((y)*(dz) )+((x)*(dz)*(dy)))' – 2012-03-12 14:32:21

它不会大规模减慢你的代码。是的,如果你不能分配,请检查所有分配并亲切地退出。

是的,它也会要求你释放你分配的内存。欢迎使用C :)

如果您不想少分配,请使用垃圾回收器和异常语言。首先让你不要自己释放记忆。其次,如果你不能分配内存(除非它不是你想要做的事情,因为例如内存被分配了一部分可选的代码),你可以在一个地方捕获所有错误。

我应该真的检查每个分配的分配错误吗?

是的,你应该。

这也需要我释放已分配的存储空间。

不,你应该做的是,在任何情况下,无论你是否检查错误。

如果您害怕性能下降,那么请在内部循环之外进行内存管理。由于您现在正在使用初始化函数,因此应该没有问题。与调用内存分配器的成本相比,错误检查本身非常便宜。

+0

在这个实现中,我应该如何在循环之外实现内存管理?谢谢。 – 2012-03-11 21:10:09

+0

@NiklasR:假设函数的名字以'_Init'结尾,我认为它已经在你的处理循环之外。但是,您仍然可以简化错误处理并通过分配单个数组而不是指针数组来加速程序。 – 2012-03-11 21:11:31

简短的回答:绝对肯定的

长回答:

取决于你正在实现,你可以,例如在一次分配所需要的内存...这将是更好的关于perofrmance等

但总是检查分配错误,并始终免费分配(只有一次!)。

如果不这样做造成的任何负面几个方面:访问空指针,内存泄漏等 - 的东东不稳定和脆弱的软件是由...

+0

我喜欢一次分配存储的想法。想想如何实现它,而不需要计算我想要访问的3-D单元的线性索引。我的意思是,我不想像'cells [10]'那样访问“3d阵列”。 – 2012-03-11 21:13:10