结构矢量与动态分配的成员

时间:2011-11-14 16:13:19

标签: c++ vector struct

如果我想用结构填充向量,并且在结构中我需要动态分配/重新定位WCHAR数组,我将如何填充它?
我无法使用std::wstring,因为我将使用Windows API的成员。 像RegQueryValueEx这样的函数需要LPBYTE来接收数据。

或者我应该使用其他一些STL容器吗?

示例代码:

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

vector<MYSTRUCT> myvector;

2 个答案:

答案 0 :(得分:2)

对结构成员使用std::vector<WCHAR>。这将为您的结构提供必要的复制/移动语义,以将其放在vector中,当您需要某个API的原始指针时,它可以作为&str1[0]

在执行任何可访问数据的操作之前,请务必确保它足够大(通过将其初始化为所需大小,或调用resize())。还要记住,在调整向量大小时,数据的指针和迭代器将变为无效。

答案 1 :(得分:0)

您可以为结构定义复制构造函数,赋值运算符和析构函数。然后,每个实例制作的所有副本都有自己的动态分配内存副本。

或者您可以使用std::wstring

std::wstring提供了一个访问器方法c_str,它为您提供了一个指向底层以null结尾的字符串的指针。这允许您将std :: wstring与C API一起使用。

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)。我的例子假设字符长度。