this指针void *再转回this这样使用安全吗?这个过程编译器做了什么?解决思路
this指针void *再转回this这样使用安全吗?这个过程编译器做了什么?
我在封装WIN32多线程函数时候遇到的问题。
有没有更好的解决方法不用进行类型转换的呢?
在这里另外问个问题static_cast转换失败是返回NULL,还是抛出异常,或者二都都有?
谢谢!
------解决方案--------------------
只要你自己能保证是从类型A* 转换到 void* 再转换到 A* ,那么它就是安全的。
static_cast 是编译时转换,so肯定不会抛出异常,如果转换失败的话那么编译就不能通过的~
------解决方案--------------------
内存而已,就看对计算机如何解释这块内存。
当你解释的对了,计算机执行结果就是正确的。
反之就是错误的。
------解决方案--------------------
呵呵,我都是这样干的,一般来说,只要你自己保证,基本上是安全的
------解决方案--------------------
看了1L+2L的解释,LZ可以结贴了
------解决方案--------------------
这样子就可以了。wtl里头就是句柄转成this指针,完全没问题。
或者可以弄一个全局的类对象,用来保存线程句柄跟this指针的对应关系,不通过线程函数的参数传递this指针。
------解决方案--------------------
任何类型的指针都可以互相转换,因为指针的本质就是一个无符号数。
但你要保证编译器对转换了类型的指针指向的内存做操作不出现问题。
我在封装WIN32多线程函数时候遇到的问题。
- C/C++ code
//ThreadBase是一个抽象接口类 namespace BASE{ class Thread :public ThreadBase { public: void create(); //创建线程函数 void run(); private: static UINT WINAPI threadFunc(PVOID handle); //创建线程时的回调函数 private: }; } #include "Thread.h" void BASE::Thread::create() { UINT tID = 0; //创建线程时返回的ID _beginthreadex(NULL, 0, threadFunc,PVOID(this), 0 ,&tID); //现在在这里把this指针传递过去了 printf("%d\n",tID); Sleep(3); } void BASE::Thread::run() { printf("ok"); } UINT WINAPI BASE::Thread::threadFunc(PVOID handle) { Thread *p = static_cast<Thread*>(handle); //在这里转回来了 if(p) p->run(); return 0; }
有没有更好的解决方法不用进行类型转换的呢?
在这里另外问个问题static_cast转换失败是返回NULL,还是抛出异常,或者二都都有?
谢谢!
------解决方案--------------------
只要你自己能保证是从类型A* 转换到 void* 再转换到 A* ,那么它就是安全的。
static_cast 是编译时转换,so肯定不会抛出异常,如果转换失败的话那么编译就不能通过的~
------解决方案--------------------
内存而已,就看对计算机如何解释这块内存。
当你解释的对了,计算机执行结果就是正确的。
反之就是错误的。
------解决方案--------------------
呵呵,我都是这样干的,一般来说,只要你自己保证,基本上是安全的
------解决方案--------------------
看了1L+2L的解释,LZ可以结贴了
------解决方案--------------------
这样子就可以了。wtl里头就是句柄转成this指针,完全没问题。
或者可以弄一个全局的类对象,用来保存线程句柄跟this指针的对应关系,不通过线程函数的参数传递this指针。
------解决方案--------------------
任何类型的指针都可以互相转换,因为指针的本质就是一个无符号数。
但你要保证编译器对转换了类型的指针指向的内存做操作不出现问题。