簡體   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