读书人

delete 一个类变量为什么会有异常

发布时间: 2012-03-07 09:13:51 作者: rapoo

求助:各位大哥,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一次

}

读书人网 >C++

热点推荐