从void *中转换/解除引用成员变量指针,这样安全吗?

时间:2010-06-11 03:42:12

标签: c++

我在攻击一个更大的项目时遇到了问题所以我做了一个简单的测试用例。如果我没有省略某些东西,我的测试代码工作正常,但也许它意外地工作,所以我想向你展示并询问这种方法是否有任何陷阱。

我有一个OutObj,它有一个成员变量(指针)InObj。 InObj具有成员函数。我将此成员变量对象(InObj)的地址作为void *发送到回调函数。这个对象的类型永远不会改变,所以在回调中我重新改造它的原始类型并在其中调用aFunc成员函数。在这个例子中它按预期工作,但在我正在研究的项目中没有。所以我可能会省略某些东西,或者可能存在一个陷阱,这种情况会偶然发生。任何意见?非常感谢。

(我在原始代码中遇到的问题是InObj.data是垃圾)。

#include <stdio.h>

class InObj
{
public:
 int data;
 InObj(int argData);
 void aFunc()
 {
  printf("Inside aFunc! data is: %d\n", data);
 };
};

InObj::InObj(int argData)
{
 data = argData;
}

class OutObj
{
public:
 InObj* objPtr;
 OutObj(int data);
 ~OutObj();
};

OutObj::OutObj(int data)
{
 objPtr = new InObj(data);
}

OutObj::~OutObj()
{
 delete objPtr;
}

void callback(void* context)
{
 ((InObj*)context)->aFunc();
}

int main ()
{
 OutObj a(42);
 callback((void*)a.objPtr);
}

2 个答案:

答案 0 :(得分:3)

是的,这是安全的。

指向任何类型的指针都可以转换为指向void的指针,然后再转回。

请注意,转换为 void*是隐式的,因此您不需要演员。

答案 1 :(得分:0)

您发布的内容应该是“安全的”,因为这样的非类型安全操作可以是安全的。我会使用static_cast而不是C样式转换来替换您拥有的强制转换,因为static_cast不允许您在类型之间进行此类不安全的转换。如果您尝试使用static_cast做一些不安全的事情,编译器会告诉您,而不是让您猜测。

(侧面不相关的注释:InObj的构造函数应该使用初始化而不是赋值:

InObj::InObj(int argData) : data(argData)
{
}