我有一个指向自定义类的指针,无法delete掉,为什么?

时间:2022-07-03 19:44:05
delete的时候,总是出现Debug 错误,好像说我的指针不是有效的堆指针。
怎么会出现这种情况呢?

15 个解决方案

#1


写出你的delete语句看看。

#2


你没有new,何必delete?

#3


源代码!!!!!!!!

#4


可能性很多,例如你的指针指向一个类的实例,并不是用new分配的空间。
就像:
Class1 c;
Class1 *p;

p=&c;
...
delete p;
一定有问题。

#5


(在没有源代码的情况下,神可以解决一切) && (我不是神)
then 我们需要源代码!!!!

#6


CString strFilePath;
while(!m_MsgList.IsEmpty())//m_MsgList是一个CPtrList类的实例
{
  CMsg *pMsg;//CMsg为我自己定义的一个类,基类是CObject
  pMsg=(CMsg *)m_MsgList.RemoveHead();
  strFilePath=pMsg->szFilePath;//szFilePath是CMsg类的成员变量
 delete pMsg;
}
以上是我的相关的部分程序,请指教!

#7


当你为一个指针申请了一定的空间
但是在无意中改变了空间的大小或结构
delete的时候就汇报错

#8


需要用delete删除的应该是用new动态建立的指针,而你这个是一个CMsg类型的指针变量,所以你不能用delete来释放它。

#9


这样的指针不能delete,就像Iamcoming说的一样:
Class1 c;
Class1 *p;

p=&c;
...
delete p;

#10


你这样当然不行
你根本就不应该释放
因为pMsg的空间根本不是pMsg的
而是m_MsgList.RemoveHead()的
这一空间可能不可以释放
CMsg *pMsg = new CMsg();
delete pMsg;
这样是可以的

#11


在你这种情况下不要delete,当出了作用范围时,pMag会被自动销毁。如果你的m_MsgList中元素都是new出来的话,在这里delete不会出错,但之后你销毁 m_MsgList还是会出错,因为你对一个指向一块已经销毁内存的指针(m_MsgList的元素)再次delete时,会出错!

#12


CComboBox *p=new CComboBox;
p=(CComboBox *)GetDlgItem(IDC_FUNNY);
.
.
.
delete p;
以上一定出错!
但是
CComboBox *p=new CComboBox;
.
.
.
delete p;
一定不出错!!
你好好想想吧!

#13


你没有new那你delete赶什么?
我认为new和delete应该对称出现的!
各位认为如何?

#14


删除出错可能有两个原因:
1.Addxxxx 或 Insertxxxx 的 CObject* 参数所代表的指针并不是new出来的
2.new 和 delete 不配套,如 new xx[] 而 delete xx; 或 new xx, delete []p。
如果上述原因都不是,我也猜不出来了。如果没有保密的情况,可以发个源码给我,我帮你看看。 bird_wang@163.com

#15


我来学习一下

#1


写出你的delete语句看看。

#2


你没有new,何必delete?

#3


源代码!!!!!!!!

#4


可能性很多,例如你的指针指向一个类的实例,并不是用new分配的空间。
就像:
Class1 c;
Class1 *p;

p=&c;
...
delete p;
一定有问题。

#5


(在没有源代码的情况下,神可以解决一切) && (我不是神)
then 我们需要源代码!!!!

#6


CString strFilePath;
while(!m_MsgList.IsEmpty())//m_MsgList是一个CPtrList类的实例
{
  CMsg *pMsg;//CMsg为我自己定义的一个类,基类是CObject
  pMsg=(CMsg *)m_MsgList.RemoveHead();
  strFilePath=pMsg->szFilePath;//szFilePath是CMsg类的成员变量
 delete pMsg;
}
以上是我的相关的部分程序,请指教!

#7


当你为一个指针申请了一定的空间
但是在无意中改变了空间的大小或结构
delete的时候就汇报错

#8


需要用delete删除的应该是用new动态建立的指针,而你这个是一个CMsg类型的指针变量,所以你不能用delete来释放它。

#9


这样的指针不能delete,就像Iamcoming说的一样:
Class1 c;
Class1 *p;

p=&c;
...
delete p;

#10


你这样当然不行
你根本就不应该释放
因为pMsg的空间根本不是pMsg的
而是m_MsgList.RemoveHead()的
这一空间可能不可以释放
CMsg *pMsg = new CMsg();
delete pMsg;
这样是可以的

#11


在你这种情况下不要delete,当出了作用范围时,pMag会被自动销毁。如果你的m_MsgList中元素都是new出来的话,在这里delete不会出错,但之后你销毁 m_MsgList还是会出错,因为你对一个指向一块已经销毁内存的指针(m_MsgList的元素)再次delete时,会出错!

#12


CComboBox *p=new CComboBox;
p=(CComboBox *)GetDlgItem(IDC_FUNNY);
.
.
.
delete p;
以上一定出错!
但是
CComboBox *p=new CComboBox;
.
.
.
delete p;
一定不出错!!
你好好想想吧!

#13


你没有new那你delete赶什么?
我认为new和delete应该对称出现的!
各位认为如何?

#14


删除出错可能有两个原因:
1.Addxxxx 或 Insertxxxx 的 CObject* 参数所代表的指针并不是new出来的
2.new 和 delete 不配套,如 new xx[] 而 delete xx; 或 new xx, delete []p。
如果上述原因都不是,我也猜不出来了。如果没有保密的情况,可以发个源码给我,我帮你看看。 bird_wang@163.com

#15


我来学习一下