2012-03-11 27 views
0

我寫了一個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

回答

3

它不會大規模減慢你的代碼。是的,如果你不能分配,請檢查所有分配並親切地退出。

是的,它也會要求你釋放你分配的內存。歡迎使用C :)

如果您不想少分配,請使用垃圾回收器和異常語言。首先讓你不要自己釋放記憶。其次,如果你不能分配內存(除非它不是你想要做的事情,因爲例如內存被分配了一部分可選的代碼),你可以在一個地方捕獲所有錯誤。

2

我應該真的檢查每個分配的分配錯誤嗎?

是的,你應該。

這也需要我釋放已分配的存儲空間。

不,你應該做的是,在任何情況下,無論你是否檢查錯誤。

如果您害怕性能下降,那麼請在內部循環之外進行內存管理。由於您現在正在使用初始化函數,因此應該沒有問題。與調用內存分配器的成本相比,錯誤檢查本身非常便宜。

+0

在這個實現中,我應該如何在循環之外實現內存管理?謝謝。 – 2012-03-11 21:10:09

+0

@NiklasR:假設函數的名字以'_Init'結尾,我認爲它已經在你的處理循環之外。但是,您仍然可以簡化錯誤處理並通過分配單個數組而不是指針數組來加速程序。 – 2012-03-11 21:11:31

1

簡短的回答:絕對肯定的

長回答:

取決於你正在實現,你可以,例如在一次分配所需要的內存...這將是更好的關於perofrmance等

但總是檢查分配錯誤,並始終免費分配(只有一次!)。

如果不這樣做造成的任何負面幾個方面:訪問空指針,內存泄漏等 - 的東東不穩定和脆弱的軟件是由...

+0

我喜歡一次分配存儲的想法。想想如何實現它,而不需要計算我想要訪問的3-D單元的線性索引。我的意思是,我不想像'cells [10]'那樣訪問「3d陣列」。 – 2012-03-11 21:13:10

相關問題