2012-06-21 1 views
2

을 통해 무효 포인터를 캐스팅, 나는내가 <pre><code>std::vector<foo*>* v = new std::vector<foo*>(); foo* f = new foo(); v->push_back(f); // size of v is 1 process->Result = static_cast<void*>(v); // Result is of type void* </code></pre> <p>및 DLL을 사용하는 EXE에서</p>을하고있어, DLL에 DLL을

if (process->Result != NULL) 
{ 
    std::vector<foo*>* v = static_cast<std::vector<foo*>*>(process->Result); 
    int size = v->size(); // <-- size is garbage (221232 or something like that) 

} 

결과가 void*이어야 할. 왜 내가 제대로 벡터를 다시 전달할 수 없다는 것을 아는 사람이 있습니까? 캐스팅에 문제가 있습니까?

감사

+1

이 주소가 양쪽에 같은 예로서

, 당신은 같은 일을 할 수 있을까? 정확히 동일한 런타임 라이브러리 * 및 * 컴파일 옵션을 사용하여 양면을 컴파일합니까? –

+0

@GregHewgill 주소는 양쪽에서 동일하지만 dsll은 vs2005를 사용하여 만들어졌으며 exe는 vs2010을 사용하여 만들어졌습니다. –

+0

맞아요. 확실히 작동하지 않을 것입니다. 'std :: vector '와 같은 표준 라이브러리 데이터 구조가 헤더 파일에 구현되기 때문에 실제 데이터 표현은 컴파일러 버전에 따라 다를 수 있습니다. –

답변

4

같은 std::vector 헤더 파일에서 구현되는 표준 라이브러리 데이터 구조 때문에, 실제 데이터를 표현 컴파일러의 버전 사이에서 상이 할 수있다. VS2005로 컴파일 된 일부 코드와 VS2010과 함께 다른 코드가있는 경우이 방식으로 std::vector을 안정적으로 반환 할 수 없습니다.

foo이 구성 요소간에 완전히 동일한 데이터 레이아웃이라고 가정하면 HeapAlloc으로 할당 된 원시 foo* 포인터의 배열을 반환 할 수 있습니다. 다시 malloc()을 사용하지 마십시오. 구성 요소가 다른 런타임 라이브러리를 사용하고 다른 할당자를 사용하여 할당 된 내용을 free() 할 수 없기 때문입니다. HeapAllocHeapFree을 사용하면 전체 프로세스에서 공유되는 Win32 표준 할당자를 사용하게됩니다. 당신의 전화 모듈

v->push_back(f); 
HANDLE heap = GetProcessHeap(); 
foo **r = (foo **)HeapAlloc(heap, 0, (v->size() + 1) * sizeof(foo *)); 
std::copy(v.begin(), v.end(), r); 
r[v->size()] = NULL; // add a sentinel so you know where the end of the array is 
process->Result = r; 

다음 :

foo **v = static_cast<foo**>(process->Result); 
for (int i = 0; v[i] != NULL; i++) { 
    printf("index %d value %p\n", i, v[i]); 
} 
HANDLE heap = GetProcessHeap(); 
HeapFree(heap, 0, v); 
+0

'HeapAlloc()'을 한번도 사용하지 않았습니다. 질문에 대한 예제를 통해 사용법을 보여 주거나 사용법을 설명하는 리소스를 가르쳐 주시겠습니까? –

+0

std :: vector에 대한 좋은 대답은 헤더 파일에 있습니다. 내 질문도 참조하십시오 : http://stackoverflow.com/questions/5661738/common-practice-in-dealing-with-warning-c4251-class-needs-to -have-dll-inter는 존 디 블링 (John Dibling)의 훌륭한 답을 가지고있었습니다. –

+0

HeapAlloc 예 : 간단한 배열 Foo * []가 작동하지 않고 int numFoos와 결합되는 이유는 무엇입니까? Ofcourse는 Foo 클래스 자체가 dll 경계를 넘어서 전송하는 것이 안전하다는 것을 전제로합니다 ... –

관련 문제