如何正确设置 void* 用户数据字段

How to set void* userData field correctly?

本文关键字:用户数 数据 字段 用户 何正确 设置 void      更新时间:2023-10-16

我将尝试描述我问题的粗略情况。其实是比较复杂,但这里我代表了核心问题。我有这样的定义:

#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_cast的组合,这可以消除恒常性

a.userData = const_cast<void*> (static_cast<const void*> (&arg ));

static_cast只是为了让这一切保持C++。

我无法想象你为什么需要这个,但它可以这样做。

编辑:根据实例化字符串的方式,您可能必须使用

std::string* copy = new std::string(arg);
a.userData = static_cast<void*>copy;

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

你可以简单地通过以下方式获取它的地址

a.usedData = &arg;

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