문제

저는 C++로 이미지 처리 응용 프로그램을 개발 중입니다.나는 많은 컴파일러 오류와 역추적을 보았지만 이것은 나에게 새로운 것입니다.

#0  0xb80c5430 in __kernel_vsyscall ()
#1  0xb7d1b6d0 in raise () from /lib/tls/i686/cmov/libc.so.6
#2  0xb7d1d098 in abort () from /lib/tls/i686/cmov/libc.so.6
#3  0xb7d5924d in ?? () from /lib/tls/i686/cmov/libc.so.6
#4  0xb7d62276 in ?? () from /lib/tls/i686/cmov/libc.so.6
#5  0xb7d639c5 in malloc () from /lib/tls/i686/cmov/libc.so.6
#6  0xb7f42f47 in operator new () from /usr/lib/libstdc++.so.6
#7  0x0805bd20 in Image<Color>::fft (this=0xb467640) at ../image_processing/image.cpp:545

여기서 무슨 일이 일어나고 있는 걸까요?new 연산자가 충돌하고 있습니다.그런데 왜?이는 메모리 부족이 아닙니다(각각 두 개의 부동 소수점이 있는 128x64 픽셀인 약 128Kb를 할당하려고 시도함).또한 내 코드의 오류이므로 이음매가 발생하지 않습니다(생성자는 건드리지 않습니다!).

언급된 줄(#7)의 코드는 다음과 같습니다.

Image<Complex> *result = new Image<Complex>(this->resX, resY); 
// this->resX = 128, resY = 64 (both int), Complex is a typedef for std::complex<float>

내 코드의 다른 위치에서도 거의 동일한 인스턴스화가 작동합니다.코드의 이 부분을 주석 처리하면 나중에 비슷한 부분에서 충돌이 발생합니다.이해가 안 되고 디버깅 방법에 대한 아이디어도 없습니다.도움이 필요하세요?

컴파일러는 gcc 4.3.3, libc는 2.9입니다(둘 다 Ubuntu Jaunty에서 제공).

업데이트:

동일한 메서드와 main()에서 잘못된 줄 바로 위에 다음 줄을 포함했습니다.

    Image<Complex> *test = new Image<Complex>(128, 64);
    delete test;

이상한 점:같은 방법으로 충돌이 발생하지만 main()에서는 충돌이 발생하지 않습니다.앞서 언급했듯이 Complex는 std::complex<float>의 형식 정의입니다.생성자가 호출되지 않습니다. 이 줄 바로 앞과 생성자 자체에 cout을 삽입했습니다.

업데이트 2:

이 팁을 제공한 KPexEA에 감사드립니다!나는 이것을 시도했다:

Image<Complex> *test = new Image<Complex>(128, 64);
delete test;

kiss_fft_cpx *output = (kiss_fft_cpx*) malloc( this->resX * this->resY/2 * sizeof(kiss_fft_cpx) );
kiss_fftndr( cfg, input, output );

Image<Complex> *test2 = new Image<Complex>(128, 64);
delete test2;

충돌이 발생하는 것 같죠?- 테스트2!그래서 내 Kissfft 솔기에 대한 malloc이 잘못된 것입니다.나는 그것을 살펴볼 것이다.

최종 업데이트:

좋아, 끝났어!여러분 모두에게 감사드립니다!

사실 그 전에 눈치챘어야 했는데.지난주에 나는 Kissfft(고속 푸리에 변환 라이브러리)가 128x128 픽셀 소스 이미지에서 130x64 픽셀 fft 이미지를 만들었다는 것을 발견했습니다.예, 너비가 128픽셀이 아니라 130픽셀입니다.이유는 묻지 마세요. 모르겠어요!따라서 128x64x가 아닌 130x64x2xsizeof(float) 바이트를 할당해야 했습니다...내가 전에 생각했던 것처럼.이상하게도 버그를 수정한 직후에 충돌이 발생하지 않고 며칠 후에 충돌이 발생했습니다.

참고로 내 최종 코드는 다음과 같습니다.

int resY = (int) ceil(this->resY/2);

kiss_fft_cpx *output = (kiss_fft_cpx*) malloc( (this->resX+2) * resY * sizeof(kiss_fft_cpx) );
kiss_fftndr( cfg, input, output );

Image<Complex> *result = new Image<Complex>(this->resX, resY);

감사해요!

충돌

도움이 되었습니까?

해결책

아마도 이전에 할당된 메모리 덩어리에 힙을 손상시키는 버퍼 오버플로가 있는 것일까요?

다른 팁

충분한 메모리를 할당하지 않았습니다.Kissfft(및 해당 문제에 대한 FFTW 및 IMKL)의 절반 스펙트럼 형식에는 X*(Y/2+1) 복소수 요소가 포함되어 있습니다.

Kiss_fftndr.h 헤더 파일을 참조하세요.

/* 입력 타임다타는 희미한 [0] x 딤스 [1] x ...X 희미[ndims-1] 스칼라 포인트

출력 주파수 데이터에는 희미함[0] X 희미함[1] X ...이 있습니다.X Dims [NDIMS-1]/2+1 복합 점 *

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top