练习:使用虚析构函数释放派生资源¶
任务描述¶
设计 Resource 与 FileResource,通过 Resource* 删除派生对象,验证虚析构函数的调用顺序。
相关知识¶
若基类指针可能指向派生对象,基类析构函数应声明为 virtual,否则通过基类指针 delete 会产生未定义行为。
delete 的动态分派¶
delete resource 先根据指针的静态类型找到 Resource 析构函数。只有当它是虚函数时,运行时才会先调用 FileResource 析构函数,再调用 Resource 析构函数。
资源所有权¶
本题的 new FileResource 与 delete resource 必须严格配对。删除后不得继续使用该指针。
编程要求¶
- 两个析构函数分别向日志追加
析构 FileResource、析构 Resource。 - 基类析构函数必须为虚函数。
test创建Resource*指向new FileResource,删除后断言日志顺序。- 日志容器以引用传入两个类,析构函数不得释放或销毁日志容器。
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 经由基类指针正确触发完整析构链。
开始你的任务吧,祝你成功!