2011-03-09 3 views
6

파일에 결과를 쓰는 데 사용되는 큰 c 코드 라이브러리가 있습니다. 나는 그것이 같은 C++ 프로그램에 플로트 * 배열을 통해 데이터를 반환하는 변환 등 (일정 파일 I/O 피하기 위해) :관리되는 C#에서 관리되지 않는 무료 C 코드 메모리

float* mgrib(...) 

이것은 ++ 여기서 내가 할 수있는 "무료"메모리를 C에서 잘 작동합니다.

IntPtr pointer = mgrib(...); 
float[] result = new float[ size ]; 
Marshal.Copy(pointer, result, 0, size); 
Marshal.FreeCoTaskMem(pointer); 

많은 분야가 함수에서 뽑아해야하기 때문에이 루프 내에 : 나는 통해 제대로 C 번호로 데이터를 얻을 수 있었다. 256 필드보다 작 으면 큰 효과가 있습니다. 그것이 더 많은 경우 경고없이 충돌합니다. 파일을 올바르게 실행 한 다음 다른 파일 (256 개 이상)을 실행하면 충돌이 발생합니다. 나는 CS 전문가가 아니지만 256은 우연의 일치 이상의 것 같습니다.

나는 어떤 통찰력을 주셔서 감사합니다. 감사.

답변

6

우선 C++ 라이브러리는 CoTaskMemAlloc을 사용하여 반환 값 버퍼를 할당 했으므로 Marshall.FreeCoTaskMem을 사용하여 해제 할 수 있습니까? various memory (de)allocation functions이 있으며 자유롭게 혼합 할 수 없습니다.

그런 이유로 라이브러리가 "한쪽에서"메모리를 할당하고 할당을 해제하기 위해 매우 자주 설계되는 이유입니다.

void mgrib(..., float *buff, int buffsize); 
+0

과 같은 것을 사용하십시오. 실제로 라이브러리는 C 코드입니다. 그것은 malloc으로 할당되었습니다 (CoTaskMemAlloc를 C로 할당 할 수 있습니까?). FreeCoTaskMem이 온라인에서 읽은 것에서 malloc과 호환되지만, 다음과 같은 주제로 머리를 쓰고 있습니다. 응답 해 주셔서 감사합니다. – Anthony

관련 문제