那么,当且仅当我们打算使用new
分配内存时,我们还需要用户定义的复制构造函数吗?
如果我们使用静态数组或std::string
怎么办?
整个静态数组和std::string
将由默认的复制构造函数复制?
文件指针怎么样?内存没有在那里分配。
答案 0 :(得分:2)
资源是您需要明确获取和发布的任何内容。
管理资源的类通常需要用户定义的析构函数,因此需要用户定义(或删除)的复制构造函数和赋值运算符,并且可能还需要移动操作。
然而,良好的设计要求“单一责任规则”,即每个班级应该只承担一项责任,仅此而已。应用此规则意味着将您的资源包装到一个类中,该类的唯一职责是管理资源,并向外部呈现类似值或类似值的语义。
以下是使用资源管理类打开文件的示例:
if (auto fp = std::unique_ptr<FILE, int(*)(FILE*)>(std::fopen("/dev/null", "wb"),
std::fclose))
{
std::fwrite(buf, 1, sizeof buf, fp.get());
}
使用单一责任原则是您的代码仍然是本地,即每个资源都有一行代码来承担责任。如果您有多个,则通常会出现指数增长的分支,以便进行错误处理和多个退出点。相比之下,单一责任意味着您只需要为每个资源担心一个地方。