2010-03-31 5 views
3

"first-fit"메모리 할당 스키마를 시뮬레이트하는 소프트웨어를 작성하고 있습니다.C++ 메모리 할당 및 링크 된 목록 구현

기본적으로 큰 X 메가 바이트 청크를 할당하고 스키마에 따라 청크가 요청되면이를 블록으로 세분합니다. 우리가 지루하게 모든 주소 값을 통해 반복하지 않고 다음 블록을 찾을 수 있습니다 (그래서

나는 각 메모리 블록의 헤더로 "노드"라는 링크 된 목록을 사용하고 있습니다.

head_ptr = (char*) malloc(total_size + sizeof(node)); 

if(head_ptr == NULL) return -1; // Malloc Error .. :-(

node* head_node = new node; // Build block header 

head_node->next = NULL; 
head_node->previous = NULL; 

// Header points to next block (which doesn't exist yet) 
memset(head_ptr,head_node, sizeof(node)); 

`

는 그러나이 마지막 행은 반환

:

error: invalid conversion from 'node*' to 'int' 

이 무효 인 이유를 이해 ...하지만 난 내 새로 할당 된 메모리의 포인터 위치로 내 노드를 어떻게 배치 할 수 있습니다

+0

이 숙제가 있습니까? –

+0

네, 제 질문은 이론보다 문법적 도움이 필요합니다. – pws5068

답변

2
memset(void* memory, int value, size_t size) 

, 그것은 복사하지 년대 head_node, 그것은 (마킹, 0으로 클리어 해제로 등 메모리를 초기화의 을 (당신이 memcpy 생각하는) head_ptr에 ...). 당신이 delete head_node에, 또는 전혀 head_ptr에 값을 복사하지 마십시오

node* head_node = (node*)head_ptr; 

이제 다음 head_ptrnode* A를

이 경우, 당신은 단순히 캐스팅 할 수있다.

+0

이 우아한 솔루션에 감사드립니다.당신은 맞습니다, 나는 Memcpy의 목적을 memcpy와 혼동하고있었습니다. – pws5068

1

문서 읽기. memset은 두 번째 매개 변수로 int (그러나 unsigned char으로 해석 됨)를 사용합니다. 첫 번째 n 바이트를 설정하는 값을 지정합니다. 여기서 메모리 영역의 세 번째 매개 변수는 n입니다.

memcpy을 사용하면 한 영역의 메모리를 다른 영역으로 복사 할 수 있습니다. 시도 :

memcpy(head_ptr, head_node, sizeof(node)); 

편집 : 사이먼에 의해 제안 또 다른 대안은, 이전 및 다음 값을 설정하는 head_ptr의 포인터 캐스트를 사용하는 것입니다.

0

그런 포인터를 할당 할 수 없습니다. 두 번째 인수는 반복 될 int입니다. memset(3)에서

: 그래서

SYNOPSIS 
    #include <string.h> 

    void * 
    memset(void *b, int c, size_t len); 

DESCRIPTION 
    The memset() function writes len bytes of value c (converted to 
    an unsigned char) to the byte string b. 

RETURN VALUES 
    The memset() function returns its first argument. 
1

질문을 올바르게 이해하면 node_ptr이 할당하고 가리키는 메모리에 노드 객체를 구성하려고합니다. 당신이 호출 될 노드 생성자가 필요한 경우, 당신은 너무처럼 placement new 연산자를 통해이 작업을 수행 :

node* head_node = new(head_ptr) node; 

을 당신이 소멸자도 호출되어 있는지 확인해야하는 경우, 당신은 수동으로 삭제 호출 할 필요가 :

head_node->~node(); 
+0

만약 그가'placement new'를 사용한다면'placement delete'을 사용해야합니다 -'node'의 정의 없이는 가정을 할 수 없습니다. 기회는'placement new'는 아마 단지 멍청한'struct' 일 뿐이므로 모두 건너 뛸 수 있습니다. – vladr

+0

새로운 배치는'new (head_ptr) node'이며,'head_ptr'을 인수로하여'node'를 구성하고 있습니다. –

+0

@ 시몬 - 그걸 알아 줘서 고마워. – zdan