2010-07-29 8 views
0

클래스 A의 요소가있는 우선 순위 대기열이 있습니다.이 대기열의 요소가 필요합니다 (대기열의 우선 순위가 낮을 수 있음). 그래서, 제가 선택한 요소를 얻을 때까지 몇 가지 요소를 팝업하려고합니다. 일단 내가 선택한 요소를 얻으면 배열에 임시 저장된 모든 요소를 ​​밀어 넣을 계획입니다. 나는 루프를 가지고 있으며, 반복 될 때마다 큐에 들어가서 내가 터진 요소가 내 선택인지 확인합니다. 이렇게하면 임시 배열에 더 많은 데이터가 있습니다. 문제는이 임시 배열에서 우선 순위 큐로 데이터를 다시 푸시하려고 할 때 발생합니다. 우선 순위의 기본 컨테이너는 벡터이고 디버깅은 문제가 std_queue.h에 std :: push_heap (c.begin(), c.end(), comp) 행에 있음을 보여줍니다. (c는 벡터입니다)우선 순위 대기열을 사용하는 중 세그먼트 오류

나는 이것이 잘못된 방법일지도 모르고 아마도 malloc 대신 생성자를 사용해야하며 우선 순위 대기열 대신 std : list를 가지고 있어야하지만 어떤 것이 나에게 알려줄 수 있는지 여기에 ?

while(count < length_of_queue) // Iterate over all elements of queue 
{ 

    A* temp_array = (A *)malloc(count * sizeof(A));; 
    for (int i = 0;i<count;i++) // remove count number of elements from queue 
    { 
     temp_array[i] = priority queue.top(); 
     priority queue.pop(); // free_list is the priority queue 
    } 

    A check_element = free_list.top(); // Check if (count+1)th elements satisfies our   
            // criteria 
    if (criteria_satisfied) 
    { 
    priority_queue.pop(); 
    //freeing the temp_array and pushing back all the elements from temp_array into 
    // priority_queue like done in the else condition 
    return check_element; 
    } 
    else 
    { 

    for (int i = 0;i<count;i++) // Push back all the elements popped until now 
    { 
     priority_queue.push(temp_array[i]); // Offending line 
    } 
    free (temp_array); 
    } 
    count++ 
} 
+0

도움을 얻는 가장 좋은 방법은 문제를 보여주는 독립된 코드 조각을 제공하는 것입니다. 이 코드는 이러한 요구 사항을 충족시키지 않기 때문에 사용자가 제공 한 코드에 문제가 없기 때문에 사용자가 묻는 것을 어렵게 만들 수 있습니다. –

+1

malloc을 벡터로 바꾸십시오. 위의 코드는 매우 심하게 누출됩니다. –

+0

반환하기 전에 (local_bd_arr)을 비우지 마십시오. 또한 돌아 오기 전에 물건을 뒤로 밀지 마십시오. –

답변

1

A가 POD가 아닌 경우 malloc을 사용하면 모든 종류의 문제가 발생할 수 있습니다. 대신에 벡터를 사용

std::vector<A> temp_array(count);

무료 후 완전히 멀리 갈 것입니다.

+0

왜 그럴 수 있습니까? 이와 같은 모든 상황에서 벡터를 사용하면 수동으로 메모리 관리 작업을 수행하지 않아도됩니다. 비즈니스 로직 및 메모리 관리가 포함 된 것처럼 보이는 코드는 언제나 코드 냄새입니다. 코드는 비즈니스 논리 또는 메모리 관리입니다 (둘을 섞어 사용하지 마십시오). –

+0

@Martin 우수 포인트 - 벡터 사용을 위해 편집 됨. –

1

사용자의 malloc 행은 유형의 객체를 수용 할만큼 충분히 큰 배열을 할당하지만 실제로는 객체를 만들지 않습니다. 존재하지 않는 객체를 사용하려고하면 정의되지 않은 동작 (예 : 세그 폴트)이 발생합니다.

malloc을 std::vector<A> temp_array(count)으로 바꿔보십시오. 그러면 count 기본 배열 A 개체가 배열됩니다. 더 중요하게, 그것은 그것이 범위를 벗어날 때 스스로 자유롭게 할 것입니다.

+0

사실, malloc은 객체의 개수를 유지하기위한 배열을 생성합니다. 그러나 나중에 나는 이것을 또한 수행한다 temp_array [i] = priority queue.top(); 우선 순위 큐에는 유형 A의 요소가 있습니다. 그래서 거기에 첫 번째 객체가 생성되었습니다. 내가 알고있는 이유는 특정 라인 priority_queue.push (temp_array [i])에서 디버깅하는 동안이다; 나는 temp_array [i]가 (이 경우에는 i = 0)인지 확인하고 A 유형의 객체에 대한 참조를 해제하지만 이상하게도 코드에 들어가서 stl_vector.h에서 SIGTERM을 얻습니다. I didn 처음에는 벡터를 사용하지 않았기 때문에 기본 생성자 – cyrux

+0

이 생겼습니다. 이상한 점은 기본 생성자가 없어도 제 코드가 작동한다는 것입니다. 표준 기본 생성자를 재정의해야하는 클래스의 매개 변수화 된 생성자가 있습니다. – cyrux