跳转至

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


任务描述

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

相关知识

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

delete 的动态分派

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

资源所有权

本题的 new FileResourcedelete 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 经由基类指针正确触发完整析构链。


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