具有动态分配成员的结构体的向量

Vector of structs with dynamically allocated members

本文关键字:结构体 向量 成员 动态分配      更新时间:2023-10-16

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

或者是否有其他STL容器我应该使用?

示例代码:

typedef struct {
    WCHAR *str1;
    WCHAR *str2;
    DWORD SomeOtherStuff;
} MYSTRUCT;
vector<MYSTRUCT> myvector;

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

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

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

或者直接用std::wstring

std::wstring提供了一个访问器方法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)。我的例子假设长度为字符。