2011-11-12 3 views
-1

이것은 개정판입니다.대기열의 메모리를 확보하는 방법은 무엇입니까? 광산은 무료가 아닙니다.

메모리가 3.5GB이고 팝 기능으로 메모리가 해제되지 않습니다 ... 어떻게 새 메모리와 삭제를 사용하여 메모리를 다시 사용할 수 있습니까? 이제 STL을 사용하고 있습니다. 이후 새 및 삭제 포인터에 대해서만 작동합니까?

queue<Graphnode> ss; 
    for(i=0;i<30000000;i++) 
    { 
     ss.push(*g.root); 
    } 

    printf("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"); 
     for(i=0;i<30000000;i++) 
    { 
     ss.pop(); 
    } 
    printf("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"); 
    //delete &ss; 

여기 내 node.h 파일입니다. malloc과 free 또는 New가 필요하다고 생각합니다. 여기서 포인터를 지우시겠습니까?

#include <stdio.h> 
#include <stdlib.h> 
#include <tr1/array> 

typedef struct point 
{ 
    std::tr1::array<int, 16> state; 
    int x; 
}point; 
typedef struct Graphnode 
{ 
    struct point pvalue; 
    int depth; 
    struct Graphnode *up; 
    struct Graphnode *down; 
    struct Graphnode *left; 
    struct Graphnode *right; 
}Graphnode; 

그래서 코드를 수정하면 어떻게됩니까?

#include <stdio.h> 
#include <stdlib.h> 
#include <tr1/array> 

typedef struct point 
{ 
    std::tr1::array<int, 16> state; 
    int x; 
    int depth; 
}point; 
typedef struct Graphnode 
{ 
    point *pvalue = (point *)malloc(sizeof(point)); 
    Graphnode *up = (Graphnode*)malloc(sizeof(Graphnode)); 
    Graphnode *down= (Graphnode*)malloc(sizeof(Graphnode));; 
    Graphnode *left= (Graphnode*)malloc(sizeof(Graphnode));; 
    Graphnode *right= (Graphnode*)malloc(sizeof(Graphnode));; 
}Graphnode; 
+0

아마도'push' 함수의 코드와 큐의 요소를 어떻게 생성 하는지를 추가해야합니다. 당신의 질문에'C++'태그를 붙 였지만'자유 '를 사용하려고합니다. –

+0

미안하지만 .. 스택을위한 대기열이 아닙니다. 나는 그것을 바꿨다. 나는 C++에서 함수가 무엇인지 궁금하다. C에서 free()를 좋아한다. – weeo

+0

'delete' 연산자가 있습니다. http://www.cplusplus.com/reference/std/new/operator%20delete/를 참조하십시오. 'new'로 객체를 할당한다면'delete'를 사용해야합니다. 또한, C++ 표준 라이브러리에서는 'push_front()'또는 'push_back()'을 사용하여 컨테이너의 머리와 꼬리에 요소를 추가하므로 이름이 지정됩니다. –

답변

3

당신이 c++를 사용하는 경우, 표준 라이브러리에서 queue<T>을 사용해야합니다. 다음은 참조 번호입니다 : http://www.cplusplus.com/reference/stl/queue/.

C++ 코드의 경우 절대적으로 필요한 경우가 아니면 자신의 컨테이너 클래스를 작성하면 안됩니다. 표준 라이브러리는 대부분의 유스 케이스를 커버하는 많은 유용한 컨테이너를 제공합니다. 그들은 무겁게 사용 및 테스트하고 수년 동안했습니다.

+0

std :: deque를 기본 컨테이너로 사용하면 메모리가 계속 커집니다. – Etherealone

0

빈 큐 구조조차도 여전히 메모리를 사용합니다. 나는 그래서 비어있는 큐가 여전히 두 NULL을 때조차 headtail 포인터를 저장하기 위해 메모리를 필요로 할 것이다 당신이

struct queue 
{ 
    queueElement* head; 
    queueElement* tail; 
}; 

처럼 무언가로 큐를 정의 가정입니다.

어떻게 메모리 사용량을 측정하고 있습니까? 분명히 sizeof은 단지 일정한 크기의 struct queue 일 뿐이므로 좋지 않습니다. 그래서 나는 당신이 그것을 측정하고있는 다른 도구 나 코드를 가지고 있다고 가정합니다. 그러나 코드는 나에게 잘 보이고, 예상대로 추기경은 추억을 발표 할 것입니다.

dequeue 함수가 tail을 설정하지 않는다는 버그가 있습니다. 그러나 headhead->next으로 설정된 후에 NULL이면 tail도 NULL로 설정해야합니다. 이것이 메모리 누수를 일으키지는 않을 것이라고 생각하지만, 대기열에서 대기열에서 대기열을 비운 후에 대기열에 넣으면 확실히 부패 나 분할로 연결됩니다.

+0

시스템 모니터를 사용하여 모니터하고 있습니다. 내가 어떻게했는지 보여주는 코드를 수정했다 .... 너의 도움에 감사드립니다 .... !! – weeo

0

struct Graphnode이 자체 포함되어 있고 할당 된 메모리에 대한 포인터를 포함하지 않는 경우에만 대기열이 정리 될 수 있습니다.

void emptyQueue(struct queue *q) { 
    queueElement *element, *nextElement; 
    element = q->head; 
    while(element) { 
     nextElement = element->next; 
     free(element); 
     element = nextElement; 
    } 
    initQueue(q); 
} 

initQueue하지 malloc을 수행하기 때문에, 그것의 대조 기능, emptyQueuefree 안된다. 이렇게하면 필요한 경우 스택에 대기열을 만들 수 있습니다.

struct Graphnode에 할당 된 메모리에 대한 포인터가있는 경우 emptyQueue이 아니라 수동으로해야합니다. 코드는 같은 모양 : 당신의 C 코드에

struct Graphnode node; 
while(!isEmpty(q)) { 
    node = front(q); 
    /* Delete the stuff in `node` here. */ 
    dequeue(q); 
} 

일부 의견을 ...enqueue에서

은 당신이 :

if (q->head == NULL) { 
    //first element 
    q->head = newElement; 
    q->tail = newElement; 
} else { 
    //put it to the tail 
    q->tail->next= newElement; 
    q->tail = newElement; 
} 

당신은 두 경로에 q->tail = newElement;을 다하고 있기 때문에, 그것을 밖으로 이동 :

if (q->head == NULL) { 
    //first element 
    q->head = newElement; 
} else { 
    //put it at the tail 
    q->tail->next= newElement; 
} 
q->tail = newElement; 

또한, 일관된 들여 쓰기가 좋은 습관이다. 텍스트 편집기로이 작업을 쉽게 수행 할 수 있습니다. dequeue에서

:

if (q->head == NULL) { 
    //empty queue 
    return; 
} else { 
    element = q->head; 
    q->head = q->head->next; 
    free(element); 
} 

else가 필요하지 않은, 첫 번째 부분은 항상 return들입니다.

마지막으로
if (q->head == NULL) { 
    //empty queue 
    return; 
} 
element = q->head; 
q->head = q->head->next; 
free(element); 

, ifEmpty에서 :

return (q->head == NULL ? 1:0); 

C는 == 연산자의 결과는 다음과 같이 보장, 그래서 할 진정한 강제 아무 소용이 없다 0으로 제로로 true와 false 대표 1;

return q->head == NULL; 

마지막으로 참고 : 일부 시스템에서, "사용 된 메모리는"아래로 이동하지 않을 수 있습니다 top 같은 프로그램에 의해 읽어 보시기 바랍니다. 이것은 시스템이 나중에 사용하기 위해 해제 된 메모리 페이지를 유지하기 때문입니다. 실제 메모리는 해제 될 수 있지만 가상 메모리 주소는 종료 될 때까지 프로그램에서 "사용 가능"한 상태로 유지됩니다.

+0

대단히 감사합니다 !!! STL을 사용하여 코드를 수정했습니다. 그래서 Graphnode를 새로 만들고 삭제해야합니까? – weeo

+0

우선 Graphnode의'point'가 힙에서 할당 된 이유를 말해주십시오. 왜 'Graphnode'에 바로 저장되지 않습니까? –

관련 문제