析构函数删除指针时遇到问题有问题,请问该怎么解决?

chuyuan 2008-01-14 09:41:19
我的部分代码如下:
class SHARE_EXP_CLASS RegisterCommand
{
public:
RegisterCommand(){}
virtual ~RegisterCommand(){}
public:
virtual BOOL CanAddCommand() = 0 ;
virtual BOOL CanRemoveCommand() = 0 ;
virtual void InitCommand() = 0 ;
virtual void UnloadCommand() = 0;
};


class SHARE_EXP_CLASS RegisterCommandCompositor : public RegisterCommand
{
//此处省略部分代码,cpp文件代码也没有附上
protected:
typedef std::map<std::string , RegisterCommand* > RegisterCommandContainer;
RegisterCommandContainer m_RegCmdContainer;
}


class SHARE_EXP_CLASS RegisterCommandManager : public RegisterCommandCompositor
{
//此处省略部分代码
private:
void Init();
void Delete();
protected:
typedef std::map<std::string , CmdFun > RegisterCmdMap;
RegisterCmdMap m_RegCmdMap;
};


类RegisterCommandManager的cpp文件中:(省略其他部分)
RegisterCommandManager::RegisterCommandManager()
{
Init();
}

RegisterCommandManager::~RegisterCommandManager()
{
Delete() ;
}

void RegisterCommandManager::Delete()
{
RegisterCommandContainer::iterator it = m_RegCmdContainer.begin();
int n = m_RegCmdContainer.size();
for( ; it != m_RegCmdContainer.end() ; it++ )
{
RegisterCommand* pCmd = (*it).second;
ASSERT( pCmd != NULL ) ;
delete pCmd ;
}
m_RegCmdContainer.clear() ;
}
现在程序编译通过,但运行关闭程序时经常性(有时也没有)弹出警告:
“"0x02790b8c"指令引用的"0x0276f2f8"内存。该内存不能为"read"。要终止程序,请单击“确定”。”
进行调试,发现n>0,ASSERT通过,但执行语句“delete pCmd ;”时就弹出警告:
“Unhandled exeception in Sptt.exe (GLOBALSHARE.DLL):0xc0000005:Access Violation.”
请问这是什么原因啊?
...全文
131 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jsjl2008 2008-01-15
  • 打赏
  • 举报
回复
看的晕的

反正报错信息是引用了非法内存地址

不会是delete之前你已经delete了对象,但指正没 =NULL,导致的吧

mark~!
junheng 2008-01-14
  • 打赏
  • 举报
回复
if(指针存在){
delete 指针;
指针=NULL;
}
在销毁窗口的函数中。
sad_4978 2008-01-14
  • 打赏
  • 举报
回复
在窗口中使用这个类吗?
如果是的话,建议在销毁的窗口的时候释放。

内存泄漏 2008-01-14
  • 打赏
  • 举报
回复
有new才能delete, 有malloc才能free.. 别说你这没有new ,就算是在子函数中new 的指针返回函数外面来delete都会报错..
chuyuan 2008-01-14
  • 打赏
  • 举报
回复
假设指针指向的不是new对象,是不是不可以delete啊?
chuyuan 2008-01-14
  • 打赏
  • 举报
回复
这是注册消息命令用的,是一个公共的模块,没有对应的什么窗口啊?而且ASSERT不等于空是执行通过了,pCmd地址不是空的.

15,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧