gpt4 book ai didi

c++ - 从 void* 转换/取消引用成员变量指针,这安全吗?

转载 作者:行者123 更新时间:2023-11-30 03:10:37 24 4
gpt4 key购买 nike

我在破解一个更大的项目时遇到了问题,所以我制作了一个 simpel 测试用例。如果我没有遗漏某些东西,我的测试代码可以正常工作,但可能是意外工作,所以我想向您展示一下,并询问这种方法是否有任何缺陷。

我有一个 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);
}

最佳答案

是的,这是安全的。

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

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

关于c++ - 从 void* 转换/取消引用成员变量指针,这安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3020053/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com