求高手解答C++入门问题!!!

2025-06-28 00:18:23
推荐回答(3个)
回答1:

第一次循环时Ptr虽然多次调用new,但每次分配的内存指针都保存在TheArray数组中,此时相当于初始化的过程,绝对不能马上释放内存空间。
在调用Speak的时候,每次所使用的TheArray[i]就是之前依此申请并初始化的各个实例,使用过后可以释放,但delete的不是Ptr,而是TheArray[i],应该是delete TheArray[i]。因为此时Ptr不能重复的被delete,delete一个空指针是肯定会出错的,希望有用。

回答2:

TheArray [ i ] = Ptr ;
//在这一行加入delete Ptr ; Ptr = 0 ;出错
//这儿出错是因为后面还要访问(TheArray [ i ]->Speak ( ) ;)
}
for ( i=0 ; i <= 5 ; i++ )
TheArray [ i ]->Speak ( ) ;
//在这一行加入delete Ptr ; Ptr = 0 ;也出错
//经测试,这儿加是不会出错的。但只释放一个单元,还有其他5个单元没有释放,改成下面较好:
for ( i=0 ; i <= 5 ; i++ )
delete TheArray[i];
return 0 ;
}

回答3:

楼主 你好,看了你那两句话我也弄了很久,重新回顾了下东西,呵呵,我就以我浅陋的知识来说下自己的看法,说的不对不要怪我误认,哈哈,回答别人的问题是最好的学习方法~
首先你得弄清 delete 是释放 在堆上new的空间 ,堆上的空间是需要程序员来释放的,在程序执行完那个模块之后如果没有释放,操作系统是不会主动释放的,它会认为你new的那个地方还需要用,这样会造成堆上能用的空间减少,还有那个空间里的东西不会被覆盖,容易被人被人从中提取你程序的数据,大概就是你所说的内存泄漏啊(哈哈,我是这么想的,是不是真的我也不确定,最好自己在仔细研究下)
说了上面些,我觉得 把第一个 delete 去掉不要,你应该能理解了把,呵呵,还是说下自己的看法把。当你第一次new了一个空间给 ptr 的时候,它在堆上的地址可能是 x0fee23323,当你在循环中就释放它的时候,x0fee23323就又变成一块空地,当循环进行的第二次的时候,又有个new请求,就会造成 重新把 x0fee23323分配给ptr的可能,其实在这来说还是对的(有限空间的充分利用就是计算机要干的),但当你把这个相同的地址在给 数组的时候就有问题了,因为你数组里保存的就是上次new的空间(堆上)地址,这样你上一次数组所指的东西就没了~
现在说说第二个delete ,如果按你那加上的话,会只能释放最后一个new的,现在你得去升入弄清delete的意义(以下内容是个人理解,对正确与否不负责,哈哈)
delete就去释放 指针指向堆里的那块空间,而你上面的实现要完全释放new的空间,你得去一个个释放掉,可以 delete TheArray [ i ]; 要放在 循环里面;
哈哈,说完了,个人认为上面的实现不好(我也没想是不是有好的,哈哈,)
还可以继续讨论
~
先说到这里了~