如何检查void*是否指向对象类型的有效实例上的指针?

ale*_*son 4 c c++ dll pointers object

我正在寻找最常见和最健壮的方法来检查是否void*可以在给定的C++对象类型中进行转换.您可以在下面看到有关上下文的一些信息.

当我为DLL定义一个C API时,我经常使用void*来隐藏我后面使用的C++对象(如下所示)

typedef void* Instance_t;
int createInstance(Instance_t* pInst);
int processing(Instance_t inst, uint8_t* pBuf, size_t bufLength);
Run Code Online (Sandbox Code Playgroud)

当我createInstance的代码cast像这样的指针:

int createInstance(Instance_t* pInst)
{ 
   MyClass* ptr = new MyClass();
   *pInst = (void*)(ptr);
   //.... etc
   return 0;
 }
Run Code Online (Sandbox Code Playgroud)

但问题是我们后来如何定义我们定义的所有其他C函数,检查void*我们收到的值是否有效 MyClass*.我认为我们不能,因为C++转换操作符都不是真正的类型安全就是这种情况(偶数dynamic_cast).

现在我最好的解决方案是使用C cast(或a reinterpret_cast),如果一切正常,调用IsValid函数定义MyClass.

你有更好的方法来检查吗?

Tom*_*ner 7

你不能这样做,除非你(比如说)从内存池中分配所有的MyClass实例,并检查你传递的地址是指向该内存池的指针.或者维护一个有效实例列表.

但是,如果你需要传递一个不透明的指针,只需让客户端使用

struct MyClass;
typedef struct MyClass *Instance_t;
Run Code Online (Sandbox Code Playgroud)

这将编译干净,让您安心合理.只要您只使用指针,编译器就会很高兴.它取消引用时,编译器需要知道指针实际指向的内容.


cra*_*gmj 5

我认为你不能这样做,我认为你不应该这样做.A void *只是指向内存中某个位置的指针.几乎按照定义,没有办法知道它指向的是什么.

但是,为什么要对所有内容进行类型转换void *,为什么不在课堂上使用受保护和私有方法,如果你想阻止用户摆弄你班级的内部?