【发布时间】:2019-09-05 16:14:35
【问题描述】:
假设我们有一个类 BST_Node :
struct BST_Node {
BST_Node* left;
BST_Node* right;
}
还有一个 AVL_Node 类:
struct AVL_Node : BST_Node {
int height;
}
在某些功能中
void destroyTree() {
BST_Node *mynode = new AVL_Node;
delete mynode; // Is it ok ?
}
问题 #1
当析构函数是非虚拟的但派生中只有基元类型时,在基类上调用 delete 是否安全? (不会有内存泄漏吗?)
问题 #2
在派生类only中声明析构函数时的规则是什么?据我了解,所有的析构函数都是同一个函数,我们可以调用它 destructor() 然后当我们删除一个基指针时,析构函数只为基类调用,但是当删除派生类时,析构函数也会被分派到子派生类中。
【问题讨论】:
-
我相信这是未定义的行为。如果用
-fsanitize=undefined编译,那么通过基类删除的时候应该会有发现。 -
问题 1:我用 valgrind 尝试过,只有当我在
AVL_Node中动态分配一些内存时它才会报告内存泄漏(但这并不意味着你不会与其他编译器发生泄漏)。 Q2:我认为您误解了虚拟 DTors 的概念。基类应始终具有虚拟 DTor,因为如果您在指向 Base 的指针上调用delete,编译器只知道它应该删除 Base,它不知道您创建的类型(可能是派生的,更复杂的)可能是什么new.
标签: c++ virtual destructor