2012-03-11 3 views
0

나는 Game of Life by John Conway의 3 차원 C 구현을 작성했습니다. 이제 오류에 대한 코드를 안전하게 만들고 싶습니다. 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

포인터가 null 여부를 확인하는 빠른에 눈이 부시게입니다 모든 최신 CPU. –

+2

제안 - 모든 행/열에 대해 하나씩 배열을 할당 할 필요가 없도록 단일 배열 할당을 앞당겨 수행하는 것을 고려할 수 있습니다.그것은 "field-> cells = malloc (sizeof (golCell) * dimx * dimy * dimz)"입니다. – selbie

+0

셀비 : 그게 n 차원으로하려고했을 때했던 것입니다. 그런 다음 위의 "3d 코드"를 작성한 다음 답변을 읽은 후 3D 배열을 만드는 복잡한 방법으로 3 단계로 저장 공간을 할당하고 마침내 이제는 제안한 시점에 있습니다. , 하. xD : #define GOL_3DTOLINEAR (x, y, z, dx, dy, dz) ((z) + ((y) * (dz))를 정의하는 의사 3d 배열에서 액세스 및 요소를 검색하는 사람들을 위해 :) + ((x) * (dz) * (dy))) –

답변

3

코드 속도가 크게 저하되지 않습니다. 예. 할당 할 수없는 경우 모든 할당을 확인하고 정중하게 종료하십시오.

예, 할당 한 메모리를 확보해야합니다. C에 오신 것을 환영합니다.

할당에 관해 생각하지 않으려면 가비지 수집기 및 예외와 함께 언어를 사용하십시오. 첫째로 당신은 스스로 메모리를 비우지 않아도됩니다. 두 번째 옵션을 사용하면 메모리를 할당 할 수없는 경우 (예 : 메모리가 선택적인 코드의 일부로 할당 되었기 때문에 원하는 작업이 아닌 경우 제외) 한 곳에서 모든 오류를 catch 할 수 있습니다.

2

각 할당에서 할당 오류를 실제로 확인해야합니까?

예. 그렇습니다.

이렇게하면 이미 할당 된 저장소를 무료로 사용해야합니다.

아니요, 오류 여부를 확인했는지 여부에 관계없이 어떤 경우에도이를 수행해야합니다.

성능 저하가 염려되는 경우 내부 루프 외부에서 메모리 관리를 수행하십시오. 이제 초기화 함수에서 수행 중이므로 아무런 문제가 없어야합니다. 에러 자체를 검사하는 것은 메모리 할당자를 호출하는 비용에 비해 매우 싸다.

+0

이 구현 중 루프 외부에서 메모리 관리를 어떻게 구현해야합니까? 감사. –

+0

@NiklasR : 함수의 이름이'_Init'으로 끝나면 이미 처리 루프 밖에 있다고 가정합니다. 그러나 오류 처리를 단순화하고 포인터 배열 대신 단일 배열을 할당하여 프로그램 속도를 향상시킬 수 있습니다. –

1

짧은 대답 : 절대적으로 YES

긴 대답 :

예를 들어 한 번에 필요한 메모리를 할당 할 수있는 당신을 구현하는 내용에 따라 ... 더 좋을 것이다 관한 perofrmance 등

하지만 할당 오류가 있는지 항상 확인하고 할당 된 항목을 항상 무료로 확인하십시오 (한 번만!).

그렇게 여러 가지 부정적인 측면의 결과에 실패 : 등 널 포인터, 메모리 누수에 접근 - 불안정하고 취약한 소프트웨어가 구성되어 물건 ...

+0

나는 즉시 스토리지를 할당하는 아이디어를 좋아합니다. 액세스하려는 3-d 셀의 선형 인덱스를 계산할 필요없이 구현하는 방법을 생각해보십시오. 내 말은,''cells [10]'과 같은 "3d array"에 접근하기를 원하지 않는다는 것입니다. –

관련 문제