跳转至

练习4:使用虚析构函数释放派生资源


任务描述

设计 Resource 与 FileResource,通过 Resource* 删除派生对象,验证虚析构函数的调用顺序。

相关知识

若基类指针可能指向派生对象,基类析构函数应声明为 virtual,否则通过基类指针 delete 会产生未定义行为。

delete 的动态分派

delete resource 先根据指针的静态类型找到 Resource 析构函数。只有当它是虚函数时,运行时才会先调用 FileResource 析构函数,再调用 Resource 析构函数。

资源所有权

本题的 new FileResource 与 delete resource 必须严格配对。删除后不得继续使用该指针。

编程要求

  1. 两个析构函数分别向日志追加 析构 FileResource、析构 Resource。
  2. 基类析构函数必须为虚函数。
  3. test 创建 Resource* 指向 new FileResource,删除后断言日志顺序。
  4. 日志容器以引用传入两个类,析构函数不得释放或销毁日志容器。
  5. Resource* 删除后不再使用该指针;可将其置为 nullptr 作为良好习惯。

待完成代码

#include <cassert>
#include <string>
#include <vector>

// TODO:定义 Resource 和 FileResource
void test() {
    std::vector<std::string> log;
    Resource* resource = new FileResource(log);
    delete resource;
    resource = nullptr;
    assert(resource == nullptr);
    assert(log[0] == "析构 FileResource");
    assert(log[1] == "析构 Resource");
}

int main() {
    test();
    std::cout << "本关测试通过" << std::endl;
    return 0;
}

测试说明

预期日志严格为“析构 FileResource”“析构 Resource”。这说明 delete 经由基类指针正确触发完整析构链。


开始你的任务吧,祝你成功!