返回信息流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;
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #35526同步于 2010/1/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
一个笔试题目,类继承时候new的问题,帮忙看下,谢谢了。
youziboy
2010/1/28镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
【 在 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在这个问题上实现是相同的)。
我犯过这个毛病,把我害苦了,查这种错废了我去年整整一个五一长假
【 在 youziboy 的大作中提到: 】
: struct foo {
: virtual ~foo(){};
: };
: ...................
【 在 youziboy 的大作中提到: 】
: struct foo {
: virtual ~foo(){};
: };
: ...................
这种东西涉及到实现 就跟c++编译器相关了
不是全部的编译器都会出现异常的 只要按照c++标准来 至于实现 编译器想怎么做就怎么做 说不定就有一种编译器的内部实现恰好就不会产生异常给蒙混过关了
【 在 jokerlee 的大作中提到: 】
: 这是个经典的问题了
: 对于有显式析构函数的对象的数组,编译器会在数组前分配4个字节储存数组元素的个数(也就是需要调用析构函数的次数),因为必须知道数组实际的元素合个数, delete[]才能知道需要调用几次析构函数。
: 下面的代码
: ...................
这个跟编译器相关了 哪天我nb了 我写个这种情况不会出现异常的编译器 但却符合c++标准
【 在 jmpesp 的大作中提到: 】
: 这个跟编译器相关了 哪天我nb了 我写个这种情况不会出现异常的编译器 但却符合c++标准
这个我知道,但是即使不异常,也是内存泄露,更可怕