问两个关于内存泄漏的问题?

zhvfeng 2004-01-06 09:22:15
1:下列代码是否有问题:
CPtrArray *array = new CPtrArray();
MyClass *myClass = new MyClass();
array.Add(myClass);
delete array;
myClass对象是否还暂用资源?

2:有一个Timer,调用时需要访问一个全局的CPtrArray对像,但这个CPtrArray对象可能会随时被一个新的对象替换,怎样能把旧的对象删除,直接delete有异常。这样也不行:
CPtrArray *temp = gl_array;
gl_array = newArray;
delete temp;
同样有错误。
...全文
71 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
vollin 2004-01-06
  • 打赏
  • 举报
回复
这里当然会错了,因为你这里根本就没有new 所有不需要delete
你这里只不过是一个指针赋值,如果按我介绍的方法,如果你把newArray删除了,那么,newArray已经被赋值为NULL,这样,你的temp也就NULL了.
要注意的是,你new 的如果是newArray,那为了免于错误你就应当尽可能的去delete newArray,而不是temp。因为temp只相当于newArray的引用,它不应当负责delete。
这其实只是一个习惯的问题,只要你习惯以后,就根本不会再出现这样的问题了。
不要总是试图去delete 一个引用其它指针值的指针(虽然从程序上来说是没有问题的)。而应该delete一个你不再需要的对象,并将其指针赋为NULL,即使是在程序的结尾,这是一个好的习惯,如果你经常写程序就会发现。因为你以后会更改或增加你的程序,所以无论在什么地方,只要有delete就将其赋值为NULL.
lchlovely 2004-01-06
  • 打赏
  • 举报
回复
TO zhvfeng(追风):

多个指针指向同一个位置,删掉任意一个指针,其它指针指向的东西就没有了,
为了防止野指针,应该把他们置为NULL,
zhvfeng 2004-01-06
  • 打赏
  • 举报
回复
如果我这样注释:
CPtrArray *temp = gl_array;
gl_array = newArray;
//delete temp;
就一点问题都没有,问题当然出在delete上,不过不知道为什么会这样?
lu_zi 2004-01-06
  • 打赏
  • 举报
回复
对于集合来说,集合只是一个数据管理的功能,对于你是什么数据,是指针还是类实例,它都没有特殊的处理,它只负责保存你要保存的东西,至于你怎么使,是你的事。这是面象对象的一个特点,如果你有特殊应用可以作特殊的程序来完成。
七伤拳 2004-01-06
  • 打赏
  • 举报
回复
你的button单击事件处理是异步的吗?windows里面消息处理是排队的,你在处理按钮单击事件时是不会去处理WM_TIMER事件的。

问题是出在下面代码里的哪一句?报的是什么错?
CPtrArray *temp = gl_array;
gl_array = newArray;
delete temp;
zhvfeng 2004-01-06
  • 打赏
  • 举报
回复
感谢大家发表自己的建议!
1:看来只能遍历删除了,不明白,MFC为什么不自动删除里面的东西。
2:是这样的,我有一个button,每点一次,gl_array就会指向一个新的对象,而这个过程中timer一直运行,所以原来的对象不知该怎么删除,我试过点button之前先停止timer,然后delete gl_array,再gl_array = new CPtrArray(),还是有错误。
sharkhuang 2004-01-06
  • 打赏
  • 举报
回复
1.泄漏!
2.你应该*temp = newArray. temp是全局指针
sharkhuang 2004-01-06
  • 打赏
  • 举报
回复
内存泄漏
vollin 2004-01-06
  • 打赏
  • 举报
回复
再有,除非是使用了所谓的智能指针,否则,只要是自己new的都要自己delete
vollin 2004-01-06
  • 打赏
  • 举报
回复
写漏了一点,第3点,在delete后将指针重新赋值为NULL
vollin 2004-01-06
  • 打赏
  • 举报
回复
一个常识或者说一种默认的做法。
1.定义一个指针时将其设初始化为NULL;
2.使用new 为指针分配内存或否;
3.每次使用完成或指针的作用域末先判断其是否为空,如不为空则delete.
如此可免于内存泄漏。
一般说来只有自己new的东西才会有内存泄漏,以上的方法可完全避免,但有时是因为系统(MFC)自己分配了东西,因为有异常没有delete,这时才需要去catch异常然后自己delete.
七伤拳 2004-01-06
  • 打赏
  • 举报
回复
1、如果你不想遍历删除的话可以使用STL里面的 auto_ptr

2、把你相关的代码帖上来,你 gl_array 有没有初始化为NULL的?最好应该这样子写:
CPtrArray *temp = gl_array;
gl_array = newArray;
if (NULL != temp)
{
delete temp;
temp = NULL;
}
bluebohe 2004-01-06
  • 打赏
  • 举报
回复
1:你应该先遍历删除,再删除集合,才不会内存泄漏
bluebohe 2004-01-06
  • 打赏
  • 举报
回复
1:
当然占用资源,你应该先把数组清空,然后再删除。myClass对象可用
2:对象指针只要被删除,就给他赋值为空,如果为空,则不删除
luoshayu 2004-01-06
  • 打赏
  • 举报
回复
CPtrArray *temp = gl_array;
gl_array = newArray;
delete temp;

这个东西有问题呀
gl_array有可能是一个非法的指针,temp当然也是非法的指针,以后改变gl_array的值时temp的值不会变,要删除当然会出错了
zhvfeng 2004-01-06
  • 打赏
  • 举报
回复
第一个问题:那使用集合岂不是很麻烦,还要遍历删除,大家有什么好方法?
第二个问题:我是指timer一直在运行,如果直接delete,timer访问不到gl_array,当然要抛异常,如果不删,又会引起内存泄漏,怎么办好?
hahu 2004-01-06
  • 打赏
  • 举报
回复
可能我理解错了
可以先
delete gl_array;
gl_array=NULL;
hahu 2004-01-06
  • 打赏
  • 举报
回复
temp=NULL;
delete temp;
只删除指针,不删除对象
七伤拳 2004-01-06
  • 打赏
  • 举报
回复
1、有问题,CPtrArray 只是保存对象指针,移去一个元素时不会删除该对象,需要自己删除。

2、你是在哪里删除对象?和Timer有什么关系
zhvfeng 2004-01-06
  • 打赏
  • 举报
回复
to s_gao(Simon):有可能就是这个原因,我再仔细看看。
谢谢大家帮忙,分不多,大家凑合一下吧!
加载更多回复(5)

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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