[英]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.