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