对于“句柄”这个概念的个人理解

“句柄”这个词是从“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进行的,在构造/析构函数里申请/释放资源。

猜你喜欢

转载自blog.csdn.net/kenfan1647/article/details/114074778