首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用带有基类指针的delete会导致内存泄漏吗?

使用带有基类指针的delete会导致内存泄漏吗?
EN

Stack Overflow用户
提问于 2010-01-20 18:32:28
回答 5查看 3.2K关注 0票数 20

给定两个类,只有原始数据类型,没有自定义析构函数/释放分配器。C++规范是否保证它将以正确的大小释放?

代码语言:javascript
复制
struct A { int foo; };
struct B: public A { int bar[100000]; };
A *a = (A*)new B;
delete a;

我想知道我是否需要编写一个空的virtual dtor?

我已经尝试过g++和vc++2008,它们不会造成泄漏。但是我想知道C++标准中什么是正确的。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-01-20 18:39:49

除非基类析构函数是虚的,否则它是未定义的行为。参见5.3.5/4:

如果delete运算符的操作数的静态类型与其动态类型不同,则静态类型应为操作数的动态类型的基类,并且静态类型应具有虚拟析构函数或行为未定义。

票数 27
EN

Stack Overflow用户

发布于 2010-01-20 18:35:37

根据C++标准,你拥有的是未定义的行为--这可能会表现为泄漏,也可能不会,为了让你的代码正确,你需要一个虚拟析构函数。

此外,您不需要该(A*)强制转换。每当您发现自己在C++中使用C风格的强制转换时,您都可以相当确定它是不必要的,或者您的代码是错误的。

票数 16
EN

Stack Overflow用户

发布于 2010-01-20 18:37:32

这是一种未定义的行为--也许一切都很好,也许是哪里出了问题。要么不这么做,要么给基类提供一个虚拟析构函数。

在大多数实现中,这是不会泄漏的--类中没有堆分配的成员函数,所以当delete完成时,唯一需要做的就是释放内存。释放内存只使用对象的地址,没有更多的东西,堆完成了所有的工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2100644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档