我在主程序中NEW了一个给模态的对话框,并让其显示,在非模态对话框中new了一个CPictureView(我自己从CView派生的类)的对象m_PictureView,并把它嵌入对话框中,最后重载了非模态对话框的PostNcDestroy()函数,在该函数中delete this、delete m_PictureView,当我关闭程序时,程序执行到delete m_PictureView时就会出错,如果不加这句话就不会错,请问为什么?

解决方案 »

  1.   

    在delete前判断下m_PictrueView的窗口是否还有效先。把delete操作放到对话框的析够函数里试试
      

  2.   

    试试将 delete m_PictureView 放到对话框的 WM_DESTROY 中调用。或试试在 CPictureView 类的 PostNcDestroy 中 delete this。
      

  3.   

    delete m_PictureView,delete this换个顺序
      

  4.   

    先调用一下 m_PictureView  的 DistroyWindow
      

  5.   

    先销毁CPictureView,再销毁对话框
    另外销毁前做下判断
      

  6.   

    view属于对话框,先delete view,然后delete this
      

  7.   

    应该是哪条语句之前已经删除了m_PictureView,你再查查
      

  8.   

    m_PictureView对象是否还有效 
      

  9.   


    请仔细检查看看,有可能在某个地方你 用另外一个指针p访问了m_PictureView 所指的空间,之后执行了delete p这样m_PictureView所指定的区域就相当于已经被释放了。
      

  10.   

    CView类会在PostNcDestroy函数中delete this,不需要自己处理,如果要自己处理,就不要调用基类的PostNcDestroy函数了。
      

  11.   

    响应对话框的WM_DESTROY消息,在处理函数中delete m_PictureView。
    需要特别注意的一点时,使用向导生成的处理函数OnDestroy会先调用父类的OnDestroy,然后在下面让你增加代码。你需要在此函数的最前面做处理,最后再调用父类的OnDestroy。
      

  12.   

    谢谢大家,昨天晚上做了一个测试,发现11楼满天星的说法是正确的。
    因为cview类属于可自动销毁的窗口,其PostNcDestroy()函数本身就含有delete this代码,所以当我关闭主程序,最先得到执行的是CPictureView类的PosNcDestroy()函数,这时它已经销毁了自己,然后执行的时其父窗口即对话框的PostNcDestroy()函数,此时m_PictureView对象已经被delete掉了,再delete一次必然会引起错误。
    谢谢大家的帮助...
      

  13.   

    在主窗口delete就行了,无需在子窗口多做事情!