2011-11-14 3 views
1

구조체로 벡터를 채우고 구조체에서 WCHAR 배열을 동적으로 할당/재배치해야하는 경우 어떻게 처리합니까?
Windows API를 사용하여 멤버를 사용할 예정이므로 std::wstring을 사용할 수 없습니다. 그리고 RegQueryValueEx과 같은 기능을 사용하려면 데이터를 수신하려면 LPBYTE이 필요합니다.동적으로 할당 된 멤버가있는 구조체의 벡터

내가 사용해야하는 다른 STL 컨테이너가 있습니까?

예제 코드 :

typedef struct { 
    WCHAR *str1; 
    WCHAR *str2; 
    DWORD SomeOtherStuff; 
} MYSTRUCT; 

vector<MYSTRUCT> myvector; 
+1

나는 당신의 디자인이 끔찍하다고 믿을만한 여러 가지 이유가 있습니다. 당신이 취하기로 결정한이 매우 의심스러운 첫 단계에 대해서가 아니라 근원적 인 문제에 대해 묻지 마십시오. –

+0

Kerrek이 무뚝뚝하게 참조 할 수있는 것은 'RegQueryValueEx'가 현재 구조체에 대해 버퍼를 할당하지 않는다는 것입니다. 다른 것들 중에서도 예외적 인 안전하지 않은 힙 할당이 필요할 것입니다. 더 큰 문제는 특정 문제가 레지스트리의 다양한 양의 데이터를 필요로하는지 여부입니다. – AJG85

+0

글쎄, 레지스트리에서 키를 열거 할 것이고 목록보기 컨트롤 (Windows API)에서 사용자에게 표시 할 몇 가지 값을 저장하려고합니다. – Josh

답변

2

구조 부재는 std::vector<WCHAR>을 사용하십시오. 이렇게하면 구조체에 필요한 복사/이동 의미를 vector에 넣을 수 있으며 일부 API에 대해서는 원시 포인터가 필요하면 &str1[0]으로 사용할 수 있습니다.

데이터에 액세스 할 수있는 모든 작업을 수행하기 전에 크기가 충분히 커야합니다 (필요한 크기로 초기화하거나 resize()). 또한 벡터 크기를 조정할 때 데이터에 대한 포인터와 반복기가 유효하지 않게됩니다.

+0

뭔가 잘못하고 있는게 아니라면'resize' 나'reserve'를 사용해야합니다. – Josh

+0

@ Josh : 네, 당신은 항상 당신이 그걸로 할 필요가있는 것을 위해 충분히 커야합니다. –

+0

'resize' 또는'reserve'를 사용해야합니까? – Josh

0

당신은 당신의 구조체에 대한 복사 생성자, 대입 연산자, 소멸자를 정의 할 수 있습니다. 그리고 나서 각 인스턴스로 만들어진 모든 복사본은 동적으로 할당 된 메모리의 복사본을 가지게됩니다.

아니면 그냥 std::wstring

std::wstring 사용할 수 있습니다 당신에게 기본 null로 종료 된 문자열에 대한 포인터를 제공 접근 방법 c_str을 제공합니다. 이렇게하면 C API에서 std :: wstring을 사용할 수 있습니다.

std::wstring wide_string; 
some_win_api_call(wide_string.c_str()); // sending a string to winapi 

는 WINAPI에서 문자열을 얻으려면, 당신은 자신을 버퍼 및 버퍼의 길이와 함께 버퍼에 대한 포인터를 전달 할당해야합니다.

wide_string.reserve(256); // allocate some space to receive a string 
get_string_from_winapi(&wide_string[0], wide_string.capacity()); 

api가 길이를 바이트 단위로 원할 경우 wide_string.capacity() * sizeof(wchar_t)을해야 할 수도 있습니다. 내 예제에서는 길이를 문자로 가정합니다.

+2

OP가 필요하다고 생각하는'wstring'에서 데이터에 대해 비 const 포인터를 얻는 방법은 없습니다. 이를 위해서는'벡터 '이 필요합니다. –

+0

그런 식으로'reserve()'와'& string [0]'을 해킹하면 많은 컴파일러에서 동작하는 것처럼 보일지라도 정의되지 않은 동작을합니다. 최소한, 앞으로의 문자열 연산이 작동 할 수 있도록'reserve()'보다는'resize()'를 사용하십시오. –

관련 문제