在一个类的构造函数里面new了另一个类的对象

时间:2022-10-01 00:02:35


CWordView::CWordView()
{
m_pEditCode = new CEdit;
m_pEditWord = new CEdit;
m_pStaicCode = new CStatic;
m_pStaicWord = new CStatic;
m_pZoomView = new CZoomView;
m_pBtnReset = new CButton;
m_pBtnStore = new CButton;

CSize size1(0,0);
SetScrollSizes(MM_TEXT,size1);

}


CWordView::~CWordView()
{
if(m_pEditCode != NULL)
{
delete m_pEditCode;
m_pEditCode = NULL;
}
if(m_pEditWord != NULL)
{
delete m_pEditWord;
m_pEditWord = NULL;
}
if(m_pStaicCode != NULL)
{
delete m_pStaicCode ;
m_pStaicCode = NULL;
}
if(m_pStaicWord != NULL)
{
delete m_pStaicWord;
m_pStaicWord = NULL;
}
if(m_pBtnStore != NULL)
{
delete m_pBtnStore;
m_pBtnStore = NULL;
}
if(m_pBtnReset != NULL)
{
delete m_pBtnReset;
m_pBtnReset = NULL;
}
if(m_pZoomView != NULL)
{
  delete m_pZoomView;
m_pZoomView = NULL;
  }
}



这块不知道为啥有问题  就是在关闭单文档的时候 出现会挂在CWordView的析构函数里的 delete m_pZoomView这句  提示“Unhandled exception in at 0X00F6AB72  in  test.exe : 0XC000005:Acess violation reading location 0xfeefef2”

如果删除了这句话就没有问题
还有 在这个m_pZoomView里面申请了一个图像的内存 但是在m_pZoomView的析构函数里面已经delete了

请问为啥这个样子

10 个解决方案

#1


谢谢大侠了啊

#2


CZoomView的构造析构咋写的啊

#3


引用 2 楼 he_shilong 的回复:
CZoomView的构造析构咋写的啊



CZoomView::CZoomView()
{
m_fScale = 1.0;
m_pWordImg = new CRawImage;

}

CZoomView::~CZoomView()
{
if(m_pWordImg != NULL)
{
delete m_pWordImg;
m_pWordImg = NULL;
}
}


#4


在你的CZoomView这个类中,所有new过的地方的类释放时打断点调试下,CRawImage类里面应该还有new的地方,看是哪个地方出现指针异常的地方

#5


把CZoomView类中的m_pWordImg初始化为NULL式式。

#6


拿汽车打比方的话,C++类似于手动挡虽然省油但对你的操作有一定要求,.net java 类似于自动挡虽费油但易于操作,所以既然用c++你就要对它所涉及的资源要有全盘的考虑,你不能用操作自动挡汽车的方式操作手动挡汽车

#7


CRawImage类是你写的么,这个类的析构拿上来看看。或者你自己一层一层的调试下去看看。

#8


Unhandled exception in at 0X00F6AB72  in  test.exe : 0XC000005:Acess violation reading location 0xfeefef2

看错误提示,大致意思是你访问了一块不属于你的内存
这块内存在之前已经被释放掉了,但你没有把 m_pZoomView 置为 NULL

如果一段内存中的值为 0xfeeefeee,那就是已经被释放掉的内存
你再访问它就会出错

#9


看一下你的程序是不是在某个地方把 m_pZoomView 删除了而不知道

还有一个问题就是,mfc debug 模式下的内存,是按“块”来管理的
一个块中有可能不止一段内存
那么会不会是你在删除另外一段内存的时候,没有把内存的长度控制好,把存放 m_pZoomView 的那块内存也一并删除了

#10


引用 7 楼 slash2007 的回复:
CRawImage类是你写的么,这个类的析构拿上来看看。或者你自己一层一层的调试下去看看。

不是我写的 是个开源的静态库

#1


谢谢大侠了啊

#2


CZoomView的构造析构咋写的啊

#3


引用 2 楼 he_shilong 的回复:
CZoomView的构造析构咋写的啊



CZoomView::CZoomView()
{
m_fScale = 1.0;
m_pWordImg = new CRawImage;

}

CZoomView::~CZoomView()
{
if(m_pWordImg != NULL)
{
delete m_pWordImg;
m_pWordImg = NULL;
}
}


#4


在你的CZoomView这个类中,所有new过的地方的类释放时打断点调试下,CRawImage类里面应该还有new的地方,看是哪个地方出现指针异常的地方

#5


把CZoomView类中的m_pWordImg初始化为NULL式式。

#6


拿汽车打比方的话,C++类似于手动挡虽然省油但对你的操作有一定要求,.net java 类似于自动挡虽费油但易于操作,所以既然用c++你就要对它所涉及的资源要有全盘的考虑,你不能用操作自动挡汽车的方式操作手动挡汽车

#7


CRawImage类是你写的么,这个类的析构拿上来看看。或者你自己一层一层的调试下去看看。

#8


Unhandled exception in at 0X00F6AB72  in  test.exe : 0XC000005:Acess violation reading location 0xfeefef2

看错误提示,大致意思是你访问了一块不属于你的内存
这块内存在之前已经被释放掉了,但你没有把 m_pZoomView 置为 NULL

如果一段内存中的值为 0xfeeefeee,那就是已经被释放掉的内存
你再访问它就会出错

#9


看一下你的程序是不是在某个地方把 m_pZoomView 删除了而不知道

还有一个问题就是,mfc debug 模式下的内存,是按“块”来管理的
一个块中有可能不止一段内存
那么会不会是你在删除另外一段内存的时候,没有把内存的长度控制好,把存放 m_pZoomView 的那块内存也一并删除了

#10


引用 7 楼 slash2007 的回复:
CRawImage类是你写的么,这个类的析构拿上来看看。或者你自己一层一层的调试下去看看。

不是我写的 是个开源的静态库