繁体   English   中英

从void *强制转换/取消引用成员变量指针,这样安全吗?

[英]Casting/dereferencing member variable pointer from void*, is this safe?

在入侵一个更大的项目时遇到了一个问题,所以我做了一个简单的测试用例。 如果我没有遗漏任何东西,那么我的测试代码可以正常工作,但也许它偶然运行,所以我想向您展示一下,并询问这种方法是否有任何缺陷。

我有一个具有成员变量(指针)InObj的OutObj。 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);
}

是的,这很安全。

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

请注意, void*的转换是隐式的,因此不需要强制转换。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM