请问创建实例失败是什么概念?是创建CWnd对象失败,还是创建窗口失败?在什么情况下创建对象会失败?我觉得除非Memory very,very low,否则创建对象不可能失败的

解决方案 »

  1.   

    由此体现出GetSafeHwnd() 的安全性----总能返回一个hwnd
      

  2.   

    class A
    {
       void func();}
    void A::func()
    {
       cout << ((this == NULL) ? "NULL" : "Not NULL");
    }A* pA = NULL;
    pA->func();
      

  3.   

    我到是觉得this指针不可能为NULL,如果如winsy(鹰派)所说的创建失败话,那又怎么能够访问的到this 呢?对象都没有分配怎么会有指针呢?再如lms() 写的,我不知道这位仁兄有没执行过这段代码,我相信执行到pA->func(); 的时候就出现错误到,根本到不了func()函数里面。以上的知识在下的一点见解,不知对否,希望各位多多指教。
      

  4.   


    举个例子:
    CWnd *p;    // p->this 是否会是NULL?
    .....
      

  5.   

    _AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const 
    兄弟,_AFXWIN_INLINE 这是不是一个内联标志
      

  6.   

    我执行过了,class A有点小错误public: void func();其他是正确的
    再说了,compiler在生成代码时哪管对象指针是不是NULL,压栈就是了,又没有Run Time Check
      

  7.   

    lms兄的代码确实是可以的,我猜猜原因:在生成的C++代码中实际应该是这样的:
    pa->func()        ------>       A::func(pA)
    于是this就是NULL了.不知道这样猜想对不对.
    另外VeryHurt的提醒也是对的,如果把func的定义改称virtual void func(),运行就会出错,大概是因为虚函数必须在运行期查找VTable的原因.
      

  8.   

    是负责多线程的场合下的检测用的。线程A中访问其他线程创立的窗口时,如果窗口的生存期和A的访问时机不同步的话,会出现lms演示的那种情形,尤其当这些线程进入释放状态时,编码不良的结构会导致上述状况。基本上,是因为在线程A中的那个this指针只是一个副本,和其他线程中的原件是有区别的。lms所写的应该适用于某些编译器,那个调用可能被编译成:
      push edx  //压入this指针
      call far ptr [eax+32]  //32表示func()成员在调用表中的偏移位置,eax是成员函数调用Thunk表的位置。如果是虚函数,如MicroAngel所说,进不到func中了,刚调用就GPF。
      

  9.   

    比如说
    CWnd *pWnd=NULL;
    HWND hwnd=pWnd->GetSafeHandle();
    其实,导致this==NULL的结果是有很多情况的,this不过也是类内部使用的一个指针而已,相当于一个private变量,只是不是用户定义的而已。而程序中习惯用NULL表示非法指针