【问题标题】:Vector of structs with dynamically allocated members具有动态分配成员的结构向量
【发布时间】:2011-11-14 16:13:19
【问题描述】:

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

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

示例代码:

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

vector<MYSTRUCT> myvector;

【问题讨论】:

  • 我有多种理由相信你的设计很糟糕。为什么不问根本问题,而不是问你决定采取的这个非常可疑的第一步?
  • Kerrek 可能直言不讳地提到RegQueryValueEx 不会为您分配缓冲区,因此对于您当前的结构,您将需要异常不安全的堆分配等。更大的问题是,什么具体问题需要来自注册表的这些可变数量的数据?
  • 好吧,我将枚举注册表中的键,我想保存一些值以在列表视图控件 (Windows API) 中显示给用户。
  • @Josh:如果您有“几个值”,那么也许直接查询它们。否则,如果您正在制作某种注册表查看器,请查看 RegEnumKeyExRegQueryInfoKey 并使用一些绑定结构或变体来处理您可能想要显示的所有类型的注册表数据。
  • @AJG85 它不完全是一个注册表查看器。但是我要枚举大约 20-30 个键,每个键都有大约 5 个值,我想将它们存储在一些数据结构中以便于访问。我目前正在使用RegQueryValueExRegEnumKeyEx 来读取密钥。所以我只是在寻找一种方法来实现数据结构来存储数据。

标签: c++ vector struct


【解决方案1】:

对结构成员使用std::vector&lt;WCHAR&gt;。这将为您的结构提供必要的复制/移动语义,以将其放入 vector 中,并且当您需要某些 API 的原始指针时,可以使用 &amp;str1[0]

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

【讨论】:

  • 应该注意你必须使用resizereserve,除非我做错了什么?
  • @Josh:是的,您必须始终确保它足够大,可以满足您的任何需求。
  • 我应该使用resize还是reserve
  • 在这种情况下,resize 因为您要将数据直接写入向量的内存中。如果您要在向量上调用 push_backinsert,并且不想更改其大小,请使用 reserve
【解决方案2】:

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

或者你可以使用std::wstring

std::wstring 提供了一个访问器方法c_str,它为您提供了一个指向底层空终止字符串的指针。这使您可以将 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)。我的示例假定字符长度。

【讨论】:

  • 没有办法获得指向 wstring 中数据的非常量指针,我认为这是 OP 需要的。你需要一个vector&lt;WCHAR&gt;
  • 请注意,像这样使用reserve()&amp;string[0] 破解它会产生未定义的行为,即使它看起来可能适用于许多编译器。至少,使用resize() 而不是reserve() 以便将来的字符串操作有机会工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 2020-06-20
  • 2011-07-16
  • 1970-01-01
  • 2021-08-25
  • 2015-05-17
  • 2012-12-27
相关资源
最近更新 更多