问一个关于delete的问题

xiaoyin_ok 2011-09-12 10:19:57

class Base
{
public:
int x;
int y;
virtual ~Base()
{
}

};
class Derived : public Base
{
public:
int z;
};

int main()
{
Base* ptr = new Derived[10];
delete[] ptr;
}


像这样会不会有内存泄露,今天看 inside c++ object model 说这样会泄露,难道语言上没有对这种情况做处理?

...全文
143 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
机智的呆呆 2011-09-12
  • 打赏
  • 举报
回复
个人浅见,知道行为是未定义即可。木有必要再往深入讨论了,讨论一个未定义行为如同讨论屠龙之技。
未定义行为代码是不应该出现在实际代码中的。
机智的呆呆 2011-09-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hpsmouse 的回复:]
delete[] 的操作数如果静态类型和动态类型不匹配的话,行为未定义。

VS 能通过并不能说明什么,cygwin 下就挂了。
[/Quote]
ISO/IEC 14882:2003(E) 5.3.5 Delete
In the first alternative (delete object), if the static type of the operand is different from its dynamic type, the static type shall be a base class of the operand’s dynamic type and the static type shall have a virtual
destructor or the behavior is undefined. In the second alternative (delete array) if the dynamic type of the object to be deleted differs from its static type, the behavior is undefined.73)
pengzhixi 2011-09-12
  • 打赏
  • 举报
回复
不要对数组使用多态。
2011-09-12
  • 打赏
  • 举报
回复
delete[] 的操作数如果静态类型和动态类型不匹配的话,行为未定义。

VS 能通过并不能说明什么,cygwin 下就挂了。
lvjing_CSDN 2011-09-12
  • 打赏
  • 举报
回复
帮楼主顶
Jokul_Lee 2011-09-12
  • 打赏
  • 举报
回复
不会内存泄露
不过我用的时候会这么写
if(ptr)
{
delete [] ptr;
ptr = NULL;
}
xiaoyin_ok 2011-09-12
  • 打赏
  • 举报
回复
visual studio 2010 上测试,正确的调用了所有的析构函数。。
机智的呆呆 2011-09-12
  • 打赏
  • 举报
回复
数组时不会多态。
xiaoyin_ok 2011-09-12
  • 打赏
  • 举报
回复
在262页末尾~到263开头 讲到的。
意思是说 虽然Base的destructor是virtual的,delete[] ptr,在调用 ptr[0]的destructor时,会依次调用 ~Derived()和~Base() 但从ptr[1]开始,由于ptr只跳过了sizeof(Base)的长度,所以并不能指向正确的对象地址,所以调用析构函数会失败。 我想问的就是这个。
lee_09 2011-09-12
  • 打赏
  • 举报
回复
不会啊,分别在Base和Derived的析构函数里面cout一下就知道啦。
//Base* ptr = new Derived[10];
delete ptr;这样才会导致内存泄露。
原因在inside c++ object model 5.5节有讲。
fox000002 2011-09-12
  • 打赏
  • 举报
回复
Base 的 dtor 已经加 virtual 了,这是标准的写法,不会有内存泄露的

除非没有 virtual 的情况, Derived 的析构不能正常调用
谁学逆向工程 2011-09-12
  • 打赏
  • 举报
回复
没看出什么毛病
xiaoyin_ok 2011-09-12
  • 打赏
  • 举报
回复
原来如此,又找到一个未定义行为。 看来要多看看c++标准啊,有的时候按直觉编写代码,现在的编译器又能让它正确运行,问题也发现不了。 我觉得编译器给个警告也好啊。 不过我觉得既然编译器能解决,为什么不定义这种行为呢,还是挺符合直觉的呀。
qq120848369 2011-09-12
  • 打赏
  • 举报
回复
都讲的很明白了,这是一个古老的问题了.
ANT2AUNTH 2011-09-12
  • 打赏
  • 举报
回复
路过而已
  • 打赏
  • 举报
回复
顶..[Quote=引用 5 楼 eke1945 的回复:]
visual studio 2010 上测试,正确的调用了所有的析构函数。。
[/Quote]

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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