假设您有以下C ++代码段:
class base {};
class derived : public base {
public:
std::string str;
};
int main() {
base *b = new derived();
delete b;
}
这会泄漏,对吗?永远不会调用derived
字符串的析构函数,因为base
的析构函数未被标记为虚拟。或者我误解了什么?
答案 0 :(得分:4)
您是delete
- 通过base*
类型的指针派生,base
没有virtual
析构函数。
那是Undefined Behavior (UB),这意味着任何事情都可能发生。
如果std::string
已经分配了任何内存,那么会造成内存泄漏(想想短字符串优化,这意味着不需要为空字符串分配额外的内存),这是可能的(并且很可能)UB的表现,这不是可能发生的最坏情况。