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

时间:2014-09-19 08:28:08

标签: 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*`
               // also consider that it cares the pointer, and the memory should not be deallocated
}

我致电f并传递MY_STRING,以后将用作使用过的数据:

f(MY_STRING);

现在我需要将arg分配给void* userData,并确保它不会指向一些即将被解除分配的临时内存。它应该指向"永久性"存储器中。

2 个答案:

答案 0 :(得分:2)

reference operator(也称为地址)与const_cast的组合使用外卖 constness

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

static_cast只是为了保持所有C ++ ish。

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

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

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

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

答案 1 :(得分:0)

您只需通过

获取地址即可
a.usedData = &arg;

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