这个简单的代码会导致内存泄漏吗?

Would this simple code cause a memory leak?

本文关键字:内存 泄漏 简单 代码      更新时间:2023-10-16

假设您有以下C++代码片段:

class base {};
class derived : public base {
public:
    std::string str;
};
int main() {
    base *b = new derived();
    delete b;
}

这会泄漏,对吧? derived 的字符串的析构函数永远不会被调用,因为base 的析构函数没有被标记为虚拟。还是我误解了什么?

您正在通过 base* 类型的指针delete 派生,并且base没有 virtual 析构函数。

这就是未定义行为(UB),这意味着任何事情都可能发生。

虽然如果std::string分配了任何内存(想想短字符串优化,这意味着不需要为空字符串分配额外的内存),则会导致内存泄漏,这是 UB 的一种可能(并且很有可能)表现形式,但这并不是可能发生的最坏情况。