首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

,delete 一个类变量,为什么会有异常啊多谢

2012-03-07 
求助:各位大哥,delete 一个类变量,为什么会有错误啊?谢谢!#pragmacomment(lib, d3d8.lib )#pragmacommen

求助:各位大哥,delete 一个类变量,为什么会有错误啊?谢谢!
#pragma   comment   (lib, "d3d8.lib ")
#pragma   comment   (lib, "dxguid.lib ")
#pragma   comment   (lib, "strmiids.lib ")
#pragma   comment   (lib, "dsound.lib ")

#include   <dshow.h>
#include   <mmsystem.h>
#include   <mmreg.h>
#include   <dsound.h>

//释放COM接口
#define   SafeRelease(pInterface)   if(pInterface   !=   NULL)   {pInterface-> Release();   pInterface=NULL;}
//释放对象
//#define   SafeDelete(pObject)   if(pObject   !=   NULL)   {delete   pObject;   pObject   =   NULL;}

enum   EnumVideo
{
VIDEO_NONE=   0,
VIDEO_MP3=   1,
VIDEO_SOUND=   2,
VIDEO_MOVING=   4,
};
//播放所有wave,mps,和视频文件
class   CVideo
{
private:
///   direct   show
IGraphBuilder*m_pGraph;//   Filter对象
IMediaControl*m_pMediaControl;//   流媒体播放器
IMediaPosition*m_pMediaPosition;//   播放位置
IMediaEvent*m_pEvent;//   流媒体触发事件
IVideoWindow*m_pViewWin;//   播放视频的窗口

BOOLm_isLoop;//   是否循环播放

///   direct   sound
LPDIRECTSOUND8m_pSound;//   声音硬件指针
LPDIRECTSOUNDBUFFERm_pSBuffer;//   声音缓冲
DSBUFFERDESCm_dsdesc;


//初始化流媒体播放
HRESULT   InitStream();

//初始音效播放
HRESULT   InitSound();


//载入指定文件名的音乐,视频文件

public:
        HWNDm_hWnd;//   窗口句柄
bool   readfile(   LPSTR   pFileName   );
EnumVideom_Id;
//构造函数,初始化各接口,为播放作准备
CVideo(   HWND   hWnd   =   NULL   );

virtual   ~CVideo();

//判断是否播放结束,如果结束则停止播放
BOOL   IsEnd();

//播放结束
void   Stop()
{
switch(   m_Id   )
{
//   播放mps
case   VIDEO_MOVING:
m_pMediaControl-> Stop();

case   VIDEO_MP3:
//   结束播放
m_pMediaControl-> Stop();
m_Id   =   VIDEO_NONE;
break;
}
}

};


#ifndef   _Avi_Play_H
#define   _Avi_Play_H
#include   "..\\H\ExternVar.h "

class   CVideo;
class   Avi_Play
{
private:
      CVideo*   Play_Avi_start1;                       //类变量
    //   CVideo*   Play_Avi_start2;                       //类变量
    //   CVideo*   Play_Avi_start3;                       //类变量

     
      bool   PlayAvi_start1   ;                 //判断是否播放   start1   的标志
    //   bool   PlayAvi_start2   ;                 //判断是否播放   start2   的标志
    //   bool   PlayAvi_start3   ;                 //判断是否播放   start3   的标志

    //   bool   AllowPlay_Avi_start2   ;       //允许播放   start2
    //   bool   AllowPlay_Avi_start3   ;       //允许播放   start2


public:
        bool   PlayAvi_start1_3   ;             //判断是否播放   avi   start1   start2   start3   的标志  
bool   SetWndFlag;                           //判断否需要设置   hWnd

Avi_Play();

void   Play_AVI_start1_3(   );                 //播放开机   avi   start1   start2   start3
void   SetWnd(HWND   hWnd);                     //设置   CVideo   的   m_hWnd
~Avi_Play();  
};
#endif


#include   "..\\H\Avi_Play.h "
#include   "..\H\Video.h "

//----------------------------------------构造函数---------------------------
//功能:   构造初始化
//时间:   2007-07-26   14:00
Avi_Play::Avi_Play():   Play_Avi_start1   (new   CVideo)   //,   Play_Avi_start2   (new   CVideo)   ,Play_Avi_start3   (new   CVideo)  
{
              PlayAvi_start1_3   =   true;             //判断是否播放   avi   start1   start2   start3   的标志  
              PlayAvi_start1   =   true;                 //判断是否播放   start1   的标志
              SetWndFlag   =   true;                           //判断否需要设置   hWnd   (true   表示需要设置   false   表示不需要设置)
}
//----------------------------------------构造函数---------------------------


//----------------------------------------设置   CVideo   的   m_hWnd-------------------------------------------------
//功能:   设置   CVideo   的   m_hWnd
//时间:   2007-07-26   14:00
void   Avi_Play::SetWnd(HWND   hWnd)                       //设置   CVideo   的   m_hWnd
{
          Play_Avi_start1-> m_hWnd   =   hWnd;
          SetWndFlag   =   false   ;                             //表示不要再设置   hWnd
}
//----------------------------------------设置   CVideo   的   m_hWnd-------------------------------------------------


//----------------------------------------播放开机   avi   start1   start2   start3--------------------------------------
//功能:   播放开机   avi   start1   start2   start3
//时间:   2007-07-26   14:00
void     Avi_Play::Play_AVI_start1_3()
{

    if   (PlayAvi_start1_3)       //判断是否播放   avi   start1   start2   start3   的标志
      {
            if   (PlayAvi_start1)     //判断是否播放   start1   的标志
    {
                Play_Avi_start1-> Play(   ".\\avi\\start1.avi ",   VIDEO_MOVING,false);
                Play_Avi_start1-> run(VIDEO_MOVING);
                PlayAvi_start1   =   false;     //清除标志


    }
     

      if   (Play_Avi_start1-> IsEnd())   //   start1   已经播放完了
  {
                Play_Avi_start1-> Stop();     //停止播放     start1
                PlayAvi_start1_3   =   false;           //清除标志  
                //delete     Play_Avi_start1;
  }    
    }//if   (PlayAvi_start1_3)       //判断是否播放   avi   start1   start2   start3   的标志
}
//----------------------------------------播放开机   avi   start1   start2   start3--------------------------------------


//----------------------------------------析构函数-------------------------------------
//功能:   释放资源
//时间:   2007-07-26   14:00
Avi_Play::~Avi_Play()  
{
      if   (Play_Avi_start1   !=   NULL)
      {
    delete   Play_Avi_start1;
            Play_Avi_start1   =   NULL;
      }
}
//----------------------------------------析构函数-------------------------------------


为什么  
  if   (Play_Avi_start1-> IsEnd())   //   start1   已经播放完了
  {
                Play_Avi_start1-> Stop();     //停止播放     start1
                PlayAvi_start1_3   =   false;           //清除标志  
                //delete     Play_Avi_start1;
  }    
 
把     delete     Play_Avi_start1;   的注释去掉,就有内存错误呢?
那我怎么释放资源啊?
谢谢!


[解决办法]
你的主程序是怎么写的,main函数呢,看看代码
[解决办法]
估计你的代码释放内存了两次
[解决办法]
在退出之前再调用吧,比如在OnDestroy消息里.
[解决办法]
你在下面的代码块里delete了一次Play_Avi_start1

if (Play_Avi_start1-> IsEnd()) // start1 已经播放完了
{
Play_Avi_start1-> Stop(); //停止播放 start1
PlayAvi_start1_3 = false; //清除标志
delete Play_Avi_start1;
}


在Avi_Play::~Avi_Play() 析构函数里又delete了一次Play_Avi_start1,所以出错。
两处只能释放选一个,你自己看情况选择。
你也可以在delete Play_Avi_start1后,把Play_Avi_start1值设为NULL。
每次delete之前,先检查Play_Avi_start1是否为NULL.非NULL在执行delete
[解决办法]
错误应该出现再这

void Avi_Play::Play_AVI_start1_3()
{


//delete Play_Avi_start1; //这里没有把Play_Avi_Start1设为NULL,这样下次再检查指针时,他还是非NULL,因此系统还是会继续delete一次

}

热点排行
Bad Request.