C++ 如何正确设置void*userData字段?

C++ 如何正确设置void*userData字段?,c++,C++,我将试着描述我问题的大致情况。实际上是更复杂的,但在这里我代表了核心问题。我有这样的定义: #define MY_STRING "my_string" 并具有一个函数,该函数的取值和参数为const std::string&arg,如下所示: void f(const std::string& arg) { A a; a.userData = // how to assign the `arg` to `userData` filed if its type is `void*

我将试着描述我问题的大致情况。实际上是更复杂的,但在这里我代表了核心问题。我有这样的定义:

#define MY_STRING "my_string"
并具有一个函数,该函数的取值和参数为
const std::string&arg
,如下所示:

void f(const std::string& arg)
{
  A a;
  a.userData = // how to assign the `arg` to `userData` filed if its type is `void*`
               // also consider that it cares the pointer, and the memory should not be deallocated
}
我调用
f
并传递
MY_STRING
,该字符串将用作将来使用的数据:

f(MY_STRING);
现在我需要将
arg
分配给
void*
userData
,并确保它不会指向即将取消分配的临时内存。它应该指向“永久”内存。

使用(又名地址)和
const\u cast的组合,这可以去除constness:


如果您的原始
arg
未通过
new
分配,它可能超出范围,无法访问。

您只需通过

a.usedData = &arg;

但是。。。arg是临时对象(仅为此调用创建)。你确定这个指针不会超出范围吗?

什么是
A
?什么是<代码>::使用数据< /Cord>?为什么你需要在C++中使用 Value*/Cuff>?如果你想确保一个超出代码> ARG(或修改它)的字符串,你别无选择,只能复制到新的内存。@ OLIVARCHARESLVY你的答案是我使用一个需要<代码> Value*/Cube >的库。但是
void*
有什么奇怪的地方吗?@Narek:是的,我想如果要求“分配绝对的任何东西”,那么这已经是对类型安全的明确拒绝;)但是如果我做了
a.userData=&argarg
将在堆栈展开过程中被销毁时,
a.userData
将指向垃圾。@OliverCharlesworth。。。声称是的。你可以指定你认为正确的名称,如果你花时间写评论。@ NAREK,是的,我也注意到了,并且已经解决了它,THX.@达里乌斯:大多数人都把它称为“地址(of)”运算符,因为“引用”在C++中已经有了明确的含义。因为在C中它被显式地称为“地址运算符”(并且由于可能与C++中的实际引用混淆)。
f
void
,而
a
是本地的,所以指针似乎会停留在范围内。除非它被分配给一个全局函数或其他类似的函数。
std::string* copy = new std::string(arg);
a.userData = static_cast<void*>copy;
a.usedData = &arg;