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

C++ 具有动态分配成员的结构向量,c++,vector,struct,C++,Vector,Struct,如果我想用一个结构填充一个向量,并且在该结构中我需要动态分配/重新定位WCHAR数组,我将如何填充它? 我不能使用std::wstring,因为我将在Windows API中使用成员。 像RegQueryValueEx这样的函数需要一个LPBYTE来接收数据 或者我应该使用其他STL容器吗 示例代码: typedef struct { WCHAR *str1; WCHAR *str2; DWORD SomeOtherStuff; } MYSTRUCT; vector&l

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

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

示例代码:

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

vector<MYSTRUCT> myvector;
typedef结构{
WCHAR*str1;
WCHAR*str2;
德沃德还有别的东西;
}我的结构;
向量myvector;

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

或者您可以只使用
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\u string.capacity()*sizeof(wchar\u t)
。我的示例假定长度为字符。

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


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

我有多种理由相信您的设计很糟糕。为什么不问问潜在的问题,而不是你决定采取的这个非常可疑的第一步呢?Kerrek可能会直截了当地说,
RegQueryValueEx
没有为你分配缓冲区,所以在你当前的结构中,你需要异常不安全的堆分配。更大的问题是,什么样的特定问题需要从注册表中获取如此多的数据?我将枚举注册表中的键,我想保存一些值,以便在列表视图控件(Windows API)中显示给用户。@Josh:如果您有一些“值”,那么可能直接查询它们。否则,如果您正在制作某种类型的注册表查看器,请使用一些绑定结构或变量签出
RegEnumKeyEx
RegQueryInfoKey
,以处理您可能要显示的所有类型的注册表数据。@AJG85它不完全是注册表查看器。但是我列举了大约20-30个键,每个键都有大约5个值,我想存储在一些数据结构中以便于访问。我目前正在使用
RegQueryValueEx
RegEnumKeyEx
读取键。因此,我只是在寻找一种实现数据结构以存储数据的方法。没有办法在
wstring
中获得指向数据的非常量指针,我认为OP需要它。你需要一个
向量
。请注意,用
reserve()
&string[0]
这样的方法对其进行黑客攻击会产生未定义的行为,即使它可能在许多编译器上工作。至少,使用
resize()
而不是
reserve()
,这样以后的字符串操作才有可能工作。应该注意,除非我做错了什么,否则你必须使用
resize
reserve
,您必须始终确保它足够大,可以处理您需要的任何操作。我应该使用
resize
还是
reserve
?在这种情况下,
resize
,因为您将直接将数据写入向量的内存。如果要在向量上调用
push_back
insert
,并且还不想更改其大小,请使用
reserve