문제

나는 void **를 취하는 함수가있는 오래된 C 라이브러리를 가지고 있습니다 : 라코 디스

관리되는 C ++에서이 함수를 호출하려고합니다 (m_pStuff는 void * 유형의 부모 참조 클래스의 멤버입니다) : 라코 디스

이렇게하면 Visual Studio에서 다음과 같은 오류가 발생합니다. <인용구>

오류 C2440 : 'static_cast': 'cli :: interior_ptr'에서 'void **'로 변환 할 수 없습니다.

컴파일러가 void * 멤버 포인터를 등 뒤에서 cli :: interior_ptr로 변환하고 있다고 생각합니다.

방법에 대한 조언이 있습니까?

도움이 되었습니까?

해결책

수정 : 정답, 아래 참조

정말 당신은 oldFunction이 pStuff로 무엇을 할 것인지 알아야합니다. pStuff가 관리되지 않는 일부 데이터에 대한 포인터 인 경우 m_pStuff 정의를 다음으로 래핑 할 수 있습니다. 라코 디스

이렇게하면 포인터가 관리되지 않고 관리되지 않는 함수로 전달 될 수 있습니다. 물론 관리 대상 개체를이 포인터에 직접 할당 할 수는 없습니다.

기본적으로 관리되지 않는 포인터와 관리되는 포인터는 동일하지 않으며 기본 데이터를 복사하는 일종의 글루 코드 없이는 변환 할 수 없습니다. 기본적으로 관리되는 포인터는 관리되는 힙을 가리키며 이것은 가비지 수집되기 때문에 가리키는 실제 메모리 주소는 시간이 지남에 따라 변경 될 수 있습니다. 관리되지 않는 포인터는 명시 적으로 수행하지 않으면 메모리 주소를 변경하지 않습니다.

스크래치로 클래스 정의 내에서 관리되지 않거나 관리되는 것을 정의 할 수 없습니다. 하지만이 테스트 코드는 잘 작동하는 것 같습니다. 라코 디스

여기서 먼저 관리 대상 개체에서 포인터를 복사 한 다음이를 oldFunction에 전달합니다. 그런 다음 결과 (아마도 oldFunction에 의해 업데이트 됨)를 관리 대상 개체로 다시 복사합니다. 관리되는 개체가 관리되는 힙에 있기 때문에 컴파일러는 가비지 수집기가 실행될 때 이동할 수 있으므로 해당 개체에 포함 된 포인터에 대한 참조를 전달할 수 없습니다.

다른 팁

충고에 감사드립니다. 포인터는 C 스타일 추상 구조에 대한 것입니다.이 구조를 관리 코드에 노출 된 상태로두면 정의 된 구조가 없기 때문에 더 많은 고통을 초래할 것이라고 생각합니다.그래서 제가 할 일은 C 라이브러리를 C ++로 래핑 한 다음 C ++ 래퍼를 관리되는 C ++로 래핑하는 것입니다. 그러면 해당 C 구조가 관리 코드에 노출되지 않습니다.

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