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

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

Stack Overflow用户
提问于 2010-01-20 18:32:28
回答 4查看 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

回答 4

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用户

发布于 2010-01-20 18:36:51

它将使用正确的大小解除分配,因为要解除分配的大小是您获得的堆内存区域的属性(没有传递给free()-like函数的大小!)。

但是,没有调用d‘’tor。如果“B”定义了析构函数或包含任何具有非平凡析构函数的成员,则不会调用它们,从而导致潜在的内存泄漏。然而,在您的代码示例中情况并非如此。

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

https://stackoverflow.com/questions/2100644

复制
相关文章

相似问题

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