2014-02-13 3 views
0

C++ 코드에 문제가 있습니다.이 코드 부분의 메모리가 손실되었습니다. C++이 좋지 않습니다. 제발 도와주세요. 배열 대기열을 만들고 싶지만이 코드에는 오류가 있습니다.C++ 큐 메모리 누수

const size_t _queueSize; 
size_t _queueBack; 
size_t width; 
size_t height; 
u_char** _history; 

.... 

    if (_queueBack) { 
     for (int i = _queueBack; i > 0; --i) { 
      _history[i] = _history[i-1]; 
     } 
    } 
    if (_queueSize == _queueBack) { 
     delete[] _history[_queueSize + 1]; 
     _history[0] = new u_char [height*width]; 
    } else { 
     ++_queueBack; 
    } 

P. 빠른 대기열이 필요한 STL을 사용할 수 없습니다.

+0

모든 원시 포인터는 재앙에 대한 처방입니다. 실격 처리하기 전에 표준 라이브러리 대기열을 프로파일 링하는 데 귀찮았습니까? – StoryTeller

+5

"나는 C++이 좋지 않다"고 생각하여 "빠른 대기열이 필요한 STL을 사용할 수 없습니다"라고 다시 생각해 보았습니다. std :: queue보다 더 효율적인 큐를 구현할 수있는 기회는 나에게 적다. –

+0

아니요, 그렇진 않지만 낮은 수준의 배열이 필요하다고 확신합니다. 픽셀 단위로 원본 이미지를 처리하므로 STL이 비생산적인 것이라고 생각합니다. – Dmitriy

답변

0

valgrind를 사용하여 누수를 확인할 수 있습니다. 메모리 누수가 코드의 다른 부분에서 생성 될 수 있으며 해당 지점에서 "폭발"할 수 있습니다.

Btw, 나는 당신이 STL을 사용해야한다고 강력히 믿는다. 메모리와 함께 특별한 요구 사항이 필요하다면 할당자를 구현해야한다. STL보다 더 나은 솔루션을 얻을 수 있을지 의심 스럽습니다. STL은 사람들이 가장 많이 저지르는 실수 또는 전설 중 하나입니다. STL은 느리지 만 사용하는 방식입니다.

+0

iOS 용으로 개발 중이며 C, C++ 및 Obj-C 코드가 혼합되어 있습니다. xcode analizer가 오류를 찾을 수 없습니다. btw Obj-C 컨테이너가 느려졌 기 때문에 사랑 수준 솔루션을 사용하기로 결정했습니다. – Dmitriy

+0

iOS 용이라면 Valgrind를 사용할 수 없으며 더 이상 작동하지 않습니다. /. 나는 이것이 정말로 괜찮은지 모르지만'delete [] _history [_queueSize + 1]; 이것은 잘못된 것처럼 보인다. 큐가 10 개 요소 인 경우 _history [10] 또는 _history [11]을 삭제할 수 없습니다. – Raistmaj

+3

@Dmitriy 당신은 std :: queue >'가 emplacement와 move-semantics에서 얼마나 빨리 수행되는지 놀랄 것입니다. 사용하고있는 clang 3.3이 좋으므로 한 번 사용해보십시오. – WhozCraig