같은 std::vector
헤더 파일에서 구현되는 표준 라이브러리 데이터 구조 때문에, 실제 데이터를 표현 컴파일러의 버전 사이에서 상이 할 수있다. VS2005로 컴파일 된 일부 코드와 VS2010과 함께 다른 코드가있는 경우이 방식으로 std::vector
을 안정적으로 반환 할 수 없습니다.
foo
이 구성 요소간에 완전히 동일한 데이터 레이아웃이라고 가정하면 HeapAlloc
으로 할당 된 원시 foo*
포인터의 배열을 반환 할 수 있습니다. 다시 malloc()
을 사용하지 마십시오. 구성 요소가 다른 런타임 라이브러리를 사용하고 다른 할당자를 사용하여 할당 된 내용을 free()
할 수 없기 때문입니다. HeapAlloc
과 HeapFree
을 사용하면 전체 프로세스에서 공유되는 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);
이 주소가 양쪽에 같은 예로서
, 당신은 같은 일을 할 수 있을까? 정확히 동일한 런타임 라이브러리 * 및 * 컴파일 옵션을 사용하여 양면을 컴파일합니까? –
@GregHewgill 주소는 양쪽에서 동일하지만 dsll은 vs2005를 사용하여 만들어졌으며 exe는 vs2010을 사용하여 만들어졌습니다. –
맞아요. 확실히 작동하지 않을 것입니다. 'std :: vector '와 같은 표준 라이브러리 데이터 구조가 헤더 파일에 구현되기 때문에 실제 데이터 표현은 컴파일러 버전에 따라 다를 수 있습니다. –