2016-07-19 6 views
1

나는이 2 차원 구조체를 삭제하기 위해 이와 같은 기능을 가지고 있지만, 너무 빠르지 않다. (memset 또는 뭔가처럼) 훨씬 더 빠른 방법이있을 것이라고 생각한다. 어떤 생각도 감사하겠다;)2D 연결된 목록 배열 삭제, 방법?

void freeAlllistNode(LISTNODEPTR *sPtr[][10]) 
{ LISTNODEPTR temp; 
for (char i = 0; i<19; i++){ 
    for (char di = 0; di<10; di++){ 
     while (sPtr[i][di] != NULL){ 
      temp = *(sPtr[i] + di); 
      *(sPtr[i] + di) = temp->next; 
      free(temp); 
     } 
    } 
    } 
} 

그리고 그것은

typedef struct listNode{ 
char* val ; 
struct listNode *next; 
}LISTNODE; 
using LISTNODEPTR = LISTNODE*; 
+2

아니요, 더 빠른 방법이 없습니다. 동적으로 할당 된 많은 개체가 삭제됩니다. 이것이 근본입니다. 삭제할 개체가 수백 개있는 경우 삭제할 개체가 수백 개 있습니다. 바로 가기가 없습니다. 이것이 성능상의 문제로 판명되면, 처음에는 수백 개의 동적 객체를 생성하지 않아도되도록 데이터 구조를 재 설계해야합니다. –

+0

문제가 발생하지는 않지만 free()가 표시됩니다. 실제로 malloc()을 사용하여 객체를 할당합니까? 새로운/삭제되어야합니다. – Christophe

+0

정말 모든 객체를 통해 iteraate 할 필요가 있습니까? (즉, 크기와 함께 호출하는 memset과 같은 것을 의미합니다.) –

답변

4

번호 memset이 어떤 상황에서의 malloc/무료 교체, 결코 필요하다면이 경우에, 내 구조체 정의입니다. 그들은 완전히 다른 일을합니다. memset이 어떻게 든 malloc/free를 대체 할 수 있다는 제안은 동적 메모리와 동적 범위 할당이 작동하는 방식에 대한 근본적인 오해입니다.

그런 식으로 원격으로 구현할 수있는 유일한 방법은 사용자 지정 할당 클래스가있는 표준 C++ 라이브러리 컨테이너입니다. 즉, std::list, std::vector 및 기타이며이 수동 링크 목록 구현이 없습니다.

표준 C++ 라이브러리 컨테이너는 사용자 지정 할당 자 클래스를 지정하는 선택적 템플릿 매개 변수를 사용합니다. 컨테이너의 동적 메모리 할당을 관리하는 커스텀 할당 자 클래스를 작성해야합니다. 커다란 메모리 덩어리를 할당 한 다음, 컨테이너에 배치 된 각 값에 대해 조각 별 메모리를 할당합니다. 그런 다음 컨테이너가 파손되면 할당 된 모든 메모리가 약간 짧게 처리 될 수 있습니다 (delete).

물론이 방법을 수동 링크 목록 구현으로 구현할 수도 있습니다. 어쨌든 많은 작업이 필요합니다. 모든 작업을 완료해야하는 경우 수동 링크 목록으로 더 이상 시간을 낭비하지 말고 std::list을 사용하십시오.