2011-09-27 3 views
1

나는 결국 이미지 데이터를 처리하기 위해 여러 배열을 사용하는 C++ DLL 함수를 만들었습니다. 이러한 배열을 참조로 전달하고, 계산을 수행하고, 미리 할당 된 배열에서 출력을 참조로 다시 전달하려고합니다. 함수 내에서 나는 ippsMalloc 및 ippsFree을 포함하여 인텔 성능 프리미티브를 사용I * think * 메모리 누수가 있습니다. 지금 뭐야?

Process.dll 

int __stdcall ProcessImage(const float *Ref, const float *Source, float *Dest, const float *x, const float *xi, const int row, const int col, const int DFTlen, const int IMGlen) 
{ 
int k, l; 
IppStatus status; 
IppsDFTSpec_R_32f *spec; 
Ipp32f *y = ippsMalloc_32f(row), 
    *yi = ippsMalloc_32f(DFTlen), 
    *X = ippsMalloc_32f(DFTlen), 
    *R = ippsMalloc_32f(DFTlen); 

for (int i = 0; i < col; i++) 
{ 
    for (int j = 0; j < row; j++) 
     y[j] = Source[j + (row * i)]; 
    status = ippsSub_32f_I(Ref, y, row); 

      // Some interpolation calculations calculations here 

    status = ippsDFTInitAlloc_R_32f(&spec, DFTlen, IPP_FFT_DIV_INV_BY_N, ippAlgHintNone); 
    status = ippsDFTFwd_RToCCS_32f(yi, X, spec, NULL); 
    status = ippsMagnitude_32fc((Ipp32fc*)X, R, DFTlen); 

    for (int m = 0; m < IMGlen; m++) 
     Dest[m + (IMGlen * i)] = 10 * log10(R[m]); 
} 
_CrtDumpMemoryLeaks(); 

ippsDFTFree_R_32f(spec); 
ippsFree(y); 
ippsFree(yi); 
ippsFree(X); 
ippsFree(R); 
return(status); 
} 

함수 호출은 다음과 같다 :

기능은 실패하고 최대 6 개 개의 이미지를 원하는 출력을 생성하지 않습니다
for (int i = 0; i < Frames; i++) 
    ProcessFrame(&ref[i * FrameSize], &source[i * FrameSize], &dest[i * FrameSize], mX, mXi, NumPixels, Alines, DFTLength, IMGLength); 

, 그 이상과 함께 사망 :

First-chance exception at 0x022930e0 in DLL_test.exe: 0xC0000005: Access violation reading location 0x1cdda000.

나는 불행하게도, VS를 프로그램을 디버깅하려고 시도했습니다 호출 스택 위치가 "사용 가능한 소스 없음"IPP DLL에 있음을보고합니다. ippMagnitude32fc((Ipp32fc*)X, R, DFTlen)

나는 내 질문에 이르게한다. 이것이 메모리 누출인가? 그렇다면 누수가 어디에 있는지 누가 알 수 있습니까? 그렇지 않다면 누군가가이 문제를 디버깅하는 방법을 제안 할 수 있습니까?

+3

메모리 누수로 인해 액세스 위반이 발생하지 않습니다. 어떤 것이라도 정반대의 문제가있는 것 같습니다. –

+0

메모리 누수는 액세스 위반과 거의 반대입니다. – Nawaz

+0

이 코드는 읽을 수 없습니다. 그러나 X는 그 자리에 표시를했는데, 캐스트는 컴파일러가 뭔가 잘못하고 있다고 말하지 못하게 막아 버렸습니다. 그것은 당신이 잘못하는 것을 막지 못했습니다. 힙 손상이 결과입니다. –

답변

2

첫 번째 질문에 답하려면 메모리 누수가 아니라 메모리 손상입니다. 메모리 누수는 사용 된 메모리를 비우지 않으면 메모리 사용량이 늘어납니다. 그렇게해도 프로그램이 작동하지는 않지만 너무 많은 메모리를 사용해야 만 컴퓨터가 실제로 느려지거나 (스왑) 궁극적으로 "충분하지 않은 메모리 오류"로 인해 프로그램이 중단됩니다. C++에서 항상 발생하는 기본 포인터 오류입니다. 디버깅하는 방법을 설명하는 것이 어렵다는 것을 설명합니다. 충돌 직전에 중단 점을 추가하고 잘못된 것이 무엇인지 확인하려고합니다.

관련 문제