我有两个类,基类和派生类以及以下代码:
base_class *ptr = new derived_class;
delete ptr;
此代码是否会产生内存泄漏?如果是这样,我该如何处理呢?
答案 0 :(得分:22)
它不会泄漏您正在删除的对象,其内存块将被释放。
如果你还没有在base_class
中声明析构函数是虚拟的,那么它将泄漏derived_class
中包含的依赖于{{1的析构函数'的任何动态分配的对象被召唤来释放他们。这是因为如果析构函数不是虚拟的,则在这种情况下不会调用derived_class
析构函数。这也意味着derived_class
中的“嵌入对象”的析构函数不会被自动调用,这是一个单独但又附加的问题,可能导致进一步泄漏并且不执行重要的清理代码。
简而言之,声明derived_class
中的析构函数是虚拟的,您可以安全地使用您提供的技术。
有关编码示例,请参阅:
In what kind of situation, c++ destructor will not be called?