BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #35526同步于 2010/1/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

一个笔试题目,类继承时候new的问题,帮忙看下,谢谢了。

youziboy
2010/1/28镜像同步8 回复
struct foo { virtual ~foo(){}; }; struct bar: public foo{}; int main(int argc,char *argv[]) { foo* f = new bar; delete f; f=0; delete f; foo* fa = new bar[10]; delete fa; //这块为什么异常? fa = 0; delete fa; system("pause"); return 0; }
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
dream机器人#1 · 2010/1/28
一般new a[]形式的都用delete[]回收吧,这样可以执行每个对象的析构函数。至于更深层次的解释,求大牛……
jokerlee机器人#2 · 2010/1/28
【 在 youziboy 的大作中提到: 】 : struct foo { : virtual ~foo(){}; : }; : ................... 这是个经典的问题了 对于有显式析构函数的对象的数组,编译器会在数组前分配4个字节储存数组元素的个数(也就是需要调用析构函数的次数),因为必须知道数组实际的元素合个数, delete[]才能知道需要调用几次析构函数。 下面的代码 bar* fa = new bar[100]; printf("%u\n", *((char *)fa - 4)); 输出结果是100,可以证明 下面的帖子有详细的讨论 http://topic.csdn.net/u/20070712/07/57c7cfc6-7314-400d-86d2-230a72581ea5.html 补充一下就是,用delete而不是delete[]释放用new[]分配的空间这种行为是undefined的,也就是由编译器实现所决定的implementation sepcific(经过测试VC2008和gcc 4.4在这个问题上实现是相同的)。
Vampire机器人#3 · 2010/1/29
effective c++某一条款就讲的这个东西…… http://www.kuqin.com/effectivec2e/ch01d.htm
josephbupt机器人#4 · 2010/2/1
我犯过这个毛病,把我害苦了,查这种错废了我去年整整一个五一长假 【 在 youziboy 的大作中提到: 】 : struct foo { : virtual ~foo(){}; : }; : ...................
josephbupt机器人#5 · 2010/2/1
还有一点,析构函数能写成虚的就写成虚的吧,虽然损失点儿效率,但终归安全,有效防止内存泄露。
jmpesp机器人#6 · 2010/2/1
【 在 youziboy 的大作中提到: 】 : struct foo { : virtual ~foo(){}; : }; : ................... 这种东西涉及到实现 就跟c++编译器相关了 不是全部的编译器都会出现异常的 只要按照c++标准来 至于实现 编译器想怎么做就怎么做 说不定就有一种编译器的内部实现恰好就不会产生异常给蒙混过关了
jmpesp机器人#7 · 2010/2/1
【 在 jokerlee 的大作中提到: 】 : 这是个经典的问题了 : 对于有显式析构函数的对象的数组,编译器会在数组前分配4个字节储存数组元素的个数(也就是需要调用析构函数的次数),因为必须知道数组实际的元素合个数, delete[]才能知道需要调用几次析构函数。 : 下面的代码 : ................... 这个跟编译器相关了 哪天我nb了 我写个这种情况不会出现异常的编译器 但却符合c++标准
jokerlee机器人#8 · 2010/2/1
【 在 jmpesp 的大作中提到: 】 : 这个跟编译器相关了 哪天我nb了 我写个这种情况不会出现异常的编译器 但却符合c++标准 这个我知道,但是即使不异常,也是内存泄露,更可怕