“句柄”这个词是从“handle”翻译的,这个词在编程里应该作为名词而不是动词,英文里handle作为名词意思是“xxx的柄 / xxx的把手”,在编程里,句柄常用于资源管理,资源的柄/资源的把手,可以理解成握住了把柄/把手就控制住了资源,通过句柄操控资源,c++是面向对象的语言,在c++里,句柄可以理解成一个负责管控资源的对象。
《c++程序设计语言 第4版》第13.3章节举了一个例子,大概是这样:
#define debug qDebug()<<
int main(int argc, char *argv[])
{
QFile f("d://测试.txt");
f.open(QFile::ReadOnly);
QByteArray array = f.readAll();
debug QString(array);
//......其他操作
f.close();
}
这个代码看起来很简单,但是如果进行其他操作的时候导致抛出异常使程序中断,那程序获取的资源就没有释放。要想处理此问题一个方法是使用异常处理机制,在处理异常时释放资源,另一个方法是使用资源句柄。
具体操作是定义一个局部类,在局部类里面管理资源,在构造函数里申请资源,在析构函数里释放资源,对于栈内存中的对象,即使是出现异常导致程序中断也会调用对象的析构函数的。如此可确保资源一定会得到释放。
#define debug qDebug()<<
int main(int argc, char *argv[])
{
class FileHander
{
public:
FileHander(const QString & filePath)
{
file = new QFile(filePath);
if(!file->open(QFile::ReadOnly))
{
debug "打开文件失败";
}
}
~FileHander()
{
if(file)
{
if(file->isOpen())
{
file->close();
}
file->deleteLater();
debug "FileHander 释放资源";
}
}
QByteArray getFileAllData()
{
if(!file || !file->isOpen())
{
return QByteArray();
}
return file->readAll();
}
private:
QFile * file{nullptr};
};
FileHander fhander("d://测试.txt");
QByteArray array2 = std::move(fhander.getFileAllData());
debug QString(array2);
}
这里的局部类FileHander就是起到了句柄的作用,关于资源的使用都是通过FileHander进行的,在构造/析构函数里申请/释放资源。