shared_ptr中使用了 FILE* 添加删除器的用法

本文通过一个具体的示例介绍了如何使用C++中的智能指针shared_ptr来管理FILE*类型的资源。示例展示了如何打开文件、读取文件内容,并在不再需要时正确地关闭文件,而非简单地删除文件指针。

//shared_ptr中使用了 FILE*
#include <cstdlib>
#include <vector>
#include <iostream>
using namespace std;
#include <boost/shared_ptr.hpp>
using namespace boost;
void Do()
{
    cout<<"-----------------------------"<<endl;
    FILE* pFile = fopen("text.txt","r");
    if(pFile == NULL){cout<<"没有这个文件"<<endl;return;}
    shared_ptr<FILE> myFileList(pFile,&fclose);//添加一个删除器,用于关闭文件,而不是删除文件指针
    fseek(&*pFile,0,SEEK_END);
    int length = ftell(&*pFile);//注意这个文件指针的引用
    cout<<"文件长度:"<<length<<endl;
    fseek(&*pFile,0,SEEK_SET);
    char cText[100] = {0};
    fread(cText,100,length,&*pFile);
    cout<<cText<<endl;
    cout<<"-----------------------------"<<endl;
}
int main(int argc, char *argv[])
{
    Do();
    system("PAUSE");
    return EXIT_SUCCESS;
}

### `shared_ptr` 中 `_Ptr` 与 `_Rep` 成员变量的作用及使用方法 `std::shared_ptr` 是 C++ 标准库中用于实现共享所有权语义的智能指针。其内部结构通常包含两个核心成员变量:`_Ptr` 和 `_Rep`,分别用于管理资源指针和引用计数控制块。 #### `_Ptr` 成员变量 `_Ptr` 是指向实际资源的指针,即 `shared_ptr` 所管理的对象。该指针的生命周期由引用计数机制控制,当最后一个指向该资源的 `shared_ptr` 被销毁或重置时,`_Ptr` 所指向的对象将被析构并释放内存[^2]。 例如: ```cpp std::shared_ptr<int> sp(new int(42)); ``` 在该示例中,`sp` 内部的 `_Ptr` 指向堆上分配的 `int` 对象。当 `sp` 离开作用域后,若没有其他 `shared_ptr` 指向该资源,则 `delete _Ptr` 将被调用以释放内存。 #### `_Rep` 成员变量 `_Rep` 是指向控制块(control block)的指针,用于管理引用计数、弱引用计数以及析构器等信息。控制块在第一个指向资源的 `shared_ptr` 创建时被创建,通常由 `make_shared` 或构造函数指定。`_Rep` 的主要职责包括: - 跟踪强引用计数(指向资源的 `shared_ptr` 数量) - 跟踪弱引用计数(指向资源的 `weak_ptr` 数量) - 存储自定义析构器(deleter) - 存储分配器(allocator)信息 当强引用计数变为 0 时,资源将被析构;当弱引用计数也为 0 时,控制块将被销毁。 例如: ```cpp std::shared_ptr<int> sp1 = std::make_shared<int>(10); std::shared_ptr<int> sp2 = sp1; // _Rep 中的引用计数增加 ``` 在此示例中,`sp1` 和 `sp2` 共享同一个控制块 `_Rep`,其引用计数为 2。当 `sp1` 和 `sp2` 都被销毁后,资源将被释放。 #### 使用方法 - **资源管理**:`_Ptr` 用于指向堆分配的对象,其生命周期由引用计数决定。 - **引用计数**:`_Rep` 用于维护引用计数和析构逻辑,确保资源在所有共享指针不再引用后被安全释放。 - **自定义析构器**:可以通过构造函数指定自定义析构器,例如: ```cpp std::shared_ptr<FILE> fp(fopen("file.txt", "r"), fclose); ``` 此处,`fp` 的 `_Rep` 将存储 `fclose` 函数,当引用计数为 0 时自动调用 `fclose` 来释放资源。 ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值