C++资源管理进阶之路(自定义删除器全攻略)

四、c++11智能指针之shared_ptr实现:自定义删除器 private ://指向计数器的指针 T * m_ptr;//多个智能指针对象共享一个引用计数,因此要定义为指针 size_t * m_size;//数组大小 std : : mutex * m_mutex;// 互斥锁,定义为指针类型,仅仅用来保护引用计数器 public ://构造 mySharedSp(const mySharedSp < T > & other); 阅读详情

第一章:C++资源管理进阶之路概述

在现代C++开发中,资源管理是确保程序稳定性与性能的核心议题。无论是内存、文件句柄还是网络连接,资源的申请与释放必须精确控制,避免泄漏或悬空引用。随着C++11及后续标准的演进,智能指针和RAII(Resource Acquisition Is Initialization)机制已成为资源管理的基石。

智能指针的引入

C++标准库提供了三种主要的智能指针类型,用于自动化内存管理:
  • std::unique_ptr:独占所有权,不可复制但可移动
  • std::shared_ptr:共享所有权,通过引用计数管理生命周期
  • std::weak_ptr:配合shared_ptr使用,解决循环引用问题
// 示例:使用 unique_ptr 管理动态对象
#include <memory>
#include <iostream>

int main() {
    std::unique_ptr<int> ptr = std::make_unique<int>(42);
    std::cout << *ptr << std::endl; // 输出: 42
    // 对象在作用域结束时自动释放
    return 0;
}

RAII设计模式的应用

RAII将资源的生命周期绑定到对象的构造与析构过程。只要对象在栈上正确创建,其析构函数就能保证资源被释放,即使发生异常。
资源类型管理方式推荐工具
动态内存智能指针unique_ptr, shared_ptr
文件句柄RAII包装类自定义文件类或fstream
互斥锁锁守卫std::lock_guard, std::unique_lock
graph TD A[资源申请] --> B[对象构造] B --> C[使用资源] C --> D[对象析构] D --> E[资源释放]

第二章:unique_ptr自定义删除器的核心机制

2.1 自定义删除器的设计原理与类型要求

在智能指针管理资源的场景中,自定义删除器提供了释放资源的灵活机制。其核心设计基于可调用对象的类型擦除,允许用户指定不同于默认 delete 的资源回收逻辑。
类型要求
自定义删除器必须满足“可调用”且无异常抛出的语义约束。对于 std::unique_ptr,删除器类型需支持 operator() 并能正确释放指针资源。该类型在编译期绑定,影响智能指针的大小与性能。
函数对象示例
struct FileDeleter {
    void operator()(FILE* fp) const {
        if (fp) fclose(fp); // 安全关闭文件句柄
    }
};
std::unique_ptr filePtr(fopen("data.txt", "r"));
上述代码中,FileDeleter 作为状态无关的函数对象,在文件操作完成后自动触发 fclose,避免资源泄漏。删除器与指针一同存储,零运行时开销。
  • 删除器必须是 CopyConstructible
  • 调用方式需符合 del(ptr) 签名
  • 禁止抛出异常以满足 noexcept 要求

2.2 删除器在资源释放中的实际作用分析

删除器(Deleter)是RAII机制中管理资源生命周期的核心组件,尤其在智能指针中扮演关键角色。它允许自定义资源释放逻辑,确保对象销毁时能正确调用对应的清理函数。
删除器的基本实现形式
以C++智能指针为例,可自定义删除器释放动态分配资源:

std::unique_ptr<FILE, decltype(&fclose)> fp(fopen("data.txt", "r"), &fclose);
该代码使用fclose作为删除器,确保文件指针在离开作用域时自动关闭,避免资源泄漏。
删除器的优势与应用场景
  • 支持非堆内存资源管理(如文件句柄、套接字);
  • 提升异常安全性,保证析构过程的确定性;
  • 适用于封装C风格API的资源管理。

2.3 函数指针作为删除器的实现与限制

在C++资源管理中,函数指针可作为自定义删除器用于智能指针,提供灵活的资源释放逻辑。通过指定删除函数,可控制对象析构行为。
基本实现方式
void customDeleter(int* ptr) {
    std::cout << "Deleting int: " << *ptr << std::endl;
    delete ptr;
}

std::unique_ptr<int, void(*)(int*)> ptr(new int(42), customDeleter);
该代码定义了一个接收int指针的删除函数,并将其绑定到unique_ptr。构造时需显式声明删除器类型,确保调用一致性。
使用限制
  • 函数指针无法捕获上下文(如lambda带捕获)
  • 不支持状态保存,灵活性低于仿函数或lambda
  • 模板推导时需显式指定删除器类型
因此,尽管函数指针实现简单,但在复杂场景中推荐使用更现代的可调用对象。

2.4 函数对象(Functor)删除器的灵活性探讨

在C++智能指针中,删除器决定了资源释放的方式。函数对象(Functor)作为删除器提供了比函数指针更灵活的机制。
函数对象删除器的优势
  • 可携带状态:与普通函数不同,functor可以包含成员变量来保存上下文信息
  • 编译期优化:编译器可内联调用,提升性能
  • 类型安全:避免了函数指针的隐式转换问题
代码示例
struct CustomDeleter {
    void operator()(int* ptr) const {
        std::cout << "Deleting resource\n";
        delete ptr;
    }
};

std::unique_ptr<int, CustomDeleter> ptr(new int(42));
上述代码定义了一个函数对象CustomDeleter,重载了operator(),在释放资源时执行自定义逻辑。unique_ptr通过模板推导将删除器类型嵌入,实现零成本抽象。

2.5 Lambda表达式作为删除器的现代C++实践

在现代C++中,智能指针的自定义删除器通常用于管理非标准资源的释放逻辑。传统函数指针或函数对象虽可行,但Lambda表达式提供了更简洁、内联的解决方案。
Lambda作为unique_ptr删除器
auto deleter = [](FILE* f) { 
    if (f) fclose(f); 
};
std::unique_ptr filePtr(fopen("test.txt", "r"), deleter);
该代码定义了一个捕获为空的Lambda,用于关闭文件指针。Lambda类型需作为模板参数传入unique_ptr,确保删除逻辑内联且无额外开销。
优势与适用场景
  • 语法简洁,避免额外函数声明
  • 支持捕获上下文变量,实现灵活资源管理
  • 编译期生成删除逻辑,性能优于虚函数或多态删除器

第三章:常见资源类型的定制化管理策略

3.1 管理C风格动态数组的正确方式

在C++中管理C风格动态数组时,必须手动控制内存分配与释放,避免资源泄漏。使用 `new[]` 和 `delete[]` 配对操作是基本要求。
内存分配与初始化

int* arr = new int[5]{0}; // 分配5个整数并初始化为0
该代码动态分配一个包含5个整型元素的数组,并将所有值初始化为0。使用花括号初始化可确保内存清零。
安全释放内存
  • 必须使用 delete[] 释放数组,而非 delete;
  • 释放后应将指针置空,防止悬垂指针;
  • 避免多次释放同一指针。
正确模式如下:

delete[] arr;
arr = nullptr;
此操作确保内存被正确回收,并防止后续误用。

3.2 封装FILE*等C库资源的安全释放

在C++中管理C库资源如FILE*时,手动调用fclose易导致资源泄漏。为确保异常安全与RAII原则,应将其封装为类对象。
智能指针配合自定义删除器
使用std::unique_ptr并指定删除器,可自动释放文件资源:
std::unique_ptr<FILE, decltype(&fclose)> file(fopen("data.txt", "r"), &fclose);
该代码创建一个智能指针,构造时传入fopen返回的文件指针和fclose函数地址作为删除器。当file离开作用域时,自动调用fclose关闭文件,避免泄漏。
封装为资源管理类
更进一步,可设计专用文件包装类:
  • 构造函数负责打开文件
  • 析构函数确保关闭文件
  • 禁止拷贝,允许移动语义
这样既符合面向对象设计,又提升代码复用性与可测试性。

3.3 处理Windows API句柄的跨平台考量

在跨平台开发中,Windows API句柄(如HANDLE、HMODULE)是Windows特有的资源引用机制,无法直接映射到Linux或macOS系统。为实现兼容性,需抽象出统一的资源管理接口。
句柄抽象层设计
通过封装平台相关逻辑,将句柄操作转换为通用API调用:

#ifdef _WIN32
    using native_handle = HANDLE;
#else
    using native_handle = int; // 使用文件描述符模拟
#endif

class platform_handle {
    native_handle handle_;
public:
    bool open(const std::string& path);
    void close();
};
上述代码定义了跨平台句柄类型别名,并通过条件编译隔离实现差异。Windows使用HANDLE,类Unix系统则采用文件描述符替代。
常见映射关系
Windows概念POSIX近似等价
HANDLE (文件)int (fd)
HMODULEvoid* (dlopen返回值)
WaitForSingleObjectpthread_cond_wait

第四章:高级应用场景与性能优化

4.1 带状态删除器的设计与捕获资源上下文

在复杂系统中,资源的清理往往依赖于运行时上下文信息。带状态删除器通过封装删除逻辑与上下文状态,实现精准资源回收。
核心设计模式
删除器不仅执行释放操作,还需感知资源生命周期阶段。通过闭包捕获外部变量,可访问创建时的环境数据。

type StatefulDeleter struct {
    resourceID string
    onDeleted  func(string)
}

func (d *StatefulDeleter) Delete() {
    // 执行删除逻辑
    cleanup(d.resourceID)
    d.onDeleted(d.resourceID) // 回调通知
}
上述代码中,resourceID 为捕获的资源标识,onDeleted 是注册的回调函数,用于在删除后触发上下文相关的后续处理。
状态管理策略
  • 使用引用计数判断资源是否可安全释放
  • 通过上下文传递超时与取消信号
  • 记录删除前的状态快照以支持回滚

4.2 删除器大小对内存布局的影响分析

在C++智能指针管理中,删除器(deleter)的大小直接影响对象的内存布局与性能表现。当删除器体积较小时,编译器通常采用内联存储策略,将删除器嵌入控制块内部,避免额外堆分配。
小型删除器的优化存储
std::shared_ptr<int> p1(new int(42), [](int* p) { delete p; });
上述lambda删除器为空捕获,尺寸为1字节,可被编译器优化为栈上内联存储,不增加额外内存开销。
大型删除器的内存影响
  • 状态ful删除器(如含函数对象、捕获列表)可能超过控制块预留空间
  • 触发动态堆分配,增加内存碎片风险
  • 间接访问降低缓存局部性
删除器类型大小(字节)存储方式
空函数指针8内联
捕获lambda24堆分配

4.3 类型擦除技术在删除器中的应用

类型擦除是一种在编译期消除具体类型信息的技术,广泛应用于泛型编程中。在资源管理场景下,删除器(deleter)常需适配多种类型的释放逻辑,而类型擦除可统一接口。
设计动机
为使智能指针能接受任意删除器,需将不同签名的可调用对象归一化为统一类型。通过类型擦除,可在不暴露具体类型的前提下完成资源释放。
实现方式
采用虚函数或函数指针封装删除逻辑:

class ErasedDeleter {
    void* data_;
    void (*delete_fn_)(void*);
public:
    template
    ErasedDeleter(T* ptr) : data_(ptr), delete_fn_([](void* p) { delete static_cast(p); }) {}
    
    void operator()() { delete_fn_(data_); }
};
上述代码中,`data_` 存储待删对象地址,`delete_fn_` 捕获对应类型的析构逻辑。模板构造函数将具体类型“擦除”为 `void*`,实现多态行为。
  • 优势:避免模板实例化爆炸
  • 代价:间接调用带来轻微性能损耗

4.4 零开销抽象原则下的性能调优建议

在遵循零开销抽象原则时,关键在于确保高层抽象不引入运行时开销。编译期优化是实现这一目标的核心手段。
避免动态分发的抽象设计
使用泛型和内联函数可消除虚函数调用开销。例如,在 Go 中通过接口可能引入动态调度:

// 接口方式:存在动态调用开销
type Adder interface {
    Add(int, int) int
}

func Perform(a Adder, x, y int) int {
    return a.Add(x, y)
}
而使用编译期特化可完全内联:

// 泛型方式:编译器生成具体类型代码
func PerformGeneric[T any](x, y int, add func(int, int) int) int {
    return add(x, y) // 可被内联优化
}
该模式允许编译器在实例化时内联 add 函数,消除调用跳转。
性能对比参考
抽象方式调用开销内联可能性
接口调用高(vtable 查找)否
泛型 + 内联函数零是

第五章:总结与未来方向

技术演进的实际路径
现代系统架构正从单体向服务化、边缘计算演进。以某金融平台为例,其将核心交易模块拆分为微服务后,使用 Kubernetes 实现自动扩缩容,在大促期间响应延迟降低 40%。关键在于服务间通信的稳定性设计。
  • 引入 gRPC 替代 REST 提升吞吐量
  • 通过 Istio 实现细粒度流量控制
  • 采用 eBPF 技术进行无侵入监控
可观测性的实战构建
完整的可观测性需覆盖指标、日志与追踪。以下为 Prometheus 抓取自定义指标的 Go 示例:

package main

import (
    "net/http"
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promhttp"
)

var requestCounter = prometheus.NewCounter(
    prometheus.CounterOpts{
        Name: "http_requests_total",
        Help: "Total number of HTTP requests",
    })

func init() {
    prometheus.MustRegister(requestCounter)
}

func handler(w http.ResponseWriter, r *http.Request) {
    requestCounter.Inc() // 每次请求计数
    w.Write([]byte("OK"))
}
未来基础设施趋势
技术方向当前应用案例预期收益
WASM 边缘运行时Cloudflare Workers 执行函数毫秒级冷启动
AI 驱动运维(AIOps)日志异常自动聚类分析故障定位提速 60%
[Service A] -->|HTTP/gRPC| [Service Mesh] --> [Database] | v [Telemetry Collector] | v [Alerting & Dashboard]
C++操作Excel全攻略:LibXL、libxlsxwriter与OpenXLSX选型与实战 在数据处理与自动化领域,程序直接读写Excel文件是常见的工程需求。其核心原理在于通过库文件解析.xls/.xlsx的文件格式,绕过启动Excel应用程序,实现高效的数据交互。这项技术的价值在于为C++这类高性能、需深度集成的系统提供了原生数据处理能力,避免了引入脚本语言或手动操作带来的性能与依赖问题。它广泛应用于工业控制软件的数据分析模块、财务对账工具、游戏配置表导出及海量报表批量处理等场景。本文聚焦于C++操作Excel的实战方案,深入对比分析LibXL、libxlsxwriter和OpenXLSX三大 阅读详情

相关推荐

FFmpeg C++开发指南:从安装到核心架构与实战转码

音视频处理是现代软件开发中的一项基础且关键的技术,其核心在于对多媒体数据进行高效的编解码、封装与处理。理解音视频编解码原理、掌握容器格式与数据流模型,是构建流媒体应用、视频编辑工具等多媒体系统的技术基石。FFmpeg作为一套功能强大的开源多媒体框架,集成了libavcodec、libavformat等核心库,为开发者提供了从底层编解码到高层滤镜处理的全套解决方案,其价值在于能够统一处理复杂的音视频格式转换与流媒体协议。在C++工程实践中,开发者常面临跨平台编译、内存管理以及性能优化等挑战。本文聚焦于FFmp

weixin_30247781的博客 367

【C++】智能指针学习

reset( )不带参数时,若智能指针P是唯一指向该对象的指针,则释放,并置空。若智能指针P不是唯一指向该对象的指针,则引用计数减少1,同时将P置空。reset( )带参数时,若智能指针s是唯一指向对象的指针,则释放并指向参数所表达的新的对象。若P不是唯一的指针,则只减少引用计数,并指向新的对象。对于unique_ptr来说,同样也有set()和reset()这两个函数,并且使用起来是一样的。unique_ptr是一种零开销的智能指针,并且是独享的,所以不支持复制拷贝操作。的(我刚学习的时候错误地以为是。

qq_45306739的博客 763

2025 居民消费结构数据集(21列,15000条记录)XLSX

详情介绍:该数据集为 2025 年 12 个月、1250 户家庭的平衡面板消费数据,15000 行 ×21 列零缺失,覆盖 31 省、城乡均衡,含八大类消费支出和恩格尔系数(均值 0.293,属富裕区间),家庭月收入均值 8473 元、月支出 6487 元,附完整字段说明 sheet,数据干净规整,非常适合做消费结构分析、面板回归、城乡 / 区域差异对比和收入等级分类预测,但为合成数据、仅 1 年时间跨度,不适合做真实政策研究或长期趋势分析。

【C++高阶】:自定义删除器的全面探索

这篇文章主要是对之前智能指针的一个小小的补充,没有看过智能指针的读者朋友们,可以参考下下面这篇博客【C++高阶】:智能指针的全面解析-优快云博客int main()// 创建一个shared_ptr,管理一个打开的文件// 使用fclose作为定制删除器"test.txt"// 创建一个shared_ptr,管理一个打开的文件 // 使用fclose作为定制删除器 std::shared_ptr file (fopen( "test.txt" , "w" ), fclose);

island1314的博客 2211

Echarts之风力风速玫瑰图

风力风速玫瑰图前言改进之路代码如下总结导出与导入 前言 今天上班收到任务,我们老大让我研究一下这个“风速风向玫瑰图”,还说这个是百度的雷达图的变异体,于是乎我直接找的雷达图,但是雷达图没有这种柱形的,都是点线,然后我又找了好久,最后突然在echarts官网上面看到了图1-2,才终于有了思路,原来这个图不是雷达图的变异体,而是极坐标系下的堆叠柱状图,于是就开始我的“改进”之路了。 图1-1 改进之路...

qq_38776605的博客 1万+

手把手教你解锁TI MSPM0G3507开发板(2025新版,附XDS110接线图)

本文详细解析了2025版TI MSPM0G3507开发板的解锁方法,针对新版硬件中BSL引脚的电路设计变化提供了精准接线方案和UniFlash软件配置步骤。通过实测数据和专业指导,帮助开发者解决芯片锁定问题,确保调试接口正常响应。

weixin_42696271的博客 807

C++ 定制删除器

定制删除器一般作用于shared_ptr和unique_ptr,当析构写死了delete的方式释放资源时,如果资源是new[]出来的(new数组),delete于new[]不匹配,会发生不可预知的错误,或者当资源是malloc出来的与delete也不匹配。所以要用定制删除器解决这个问题,这个定制删除器相当于仿函数,只需要当智能指针构造的时候同时传入仿函数(定制删除器即可)可以看出传了定制删除器后,针对不同的开辟资源的方式采用不同的释放方式,成功释放所有开辟出来的资源!首先明白我们用定制删除器是用来解决单一的

2401_83238095的博客 511

SAP Script表单开发中ABAP preform方法的实战应用与调试技巧

本文深入探讨了在SAP Script表单开发中调用ABAP程序(preform方法)的实战应用与调试技巧。通过一个获取供应商版本名称的实例,详细讲解了如何在SE71中嵌入PERFORM指令、编写ABAP子程序进行数据查询与处理,并重点介绍了使用SAP Script Debugger进行高效调试的方法,帮助开发者灵活扩展表单功能,实现复杂业务逻辑。

o0p1q2r3的博客 551

现代嵌入式 C++——自定义删除器(Custom Deleter)

嵌入式C++自定义删除器实用指南 本文探讨了C++自定义删除器在嵌入式开发中的应用。核心价值在于:通过RAII机制安全管理各种资源(内存、文件句柄、硬件资源等),避免内存泄漏和资源管理错误。 主要内容包括: 使用场景:管理非new/delete资源(fclose/free/硬件释放等) 实现方式: 函数指针(简单但增加指针大小) 无状态函数对象(最优空间效率) 有状态删除器(需上下文时使用) shared_ptr类型擦除(灵活但开销大) 嵌入式优化建议: 优先使用无状态删除器 确保删除器noexcept 避

charlie114514191的博客 767

结构力学程序算法理论基础(一)————虚功原理

1.约束 定义约束:限制质点或者质点系运动的条件称为约束,表示这些限制条件的数学方程称为约束方程。 (1)几何约束 限制质点或者质点系在空间的几何位置的条件称为几何约束.如单摆,其中质点M可绕固定点O在平面Oxy内摆动,摆长为l.这时摆杆对质点的限制条件是:质点M必须在以点O为圆心,以l为半径的圆周上运动.其约束方程为: 又质点M在固定的曲面上运动,那么曲面方程就是质点M的约束方程,即 上...

l93919861的博客 4511

HTML入门(详细教程),前端入门从这里开始

HTML基础教程,网页框架搭建,表单制作,了解HTML标签的基本用法,每个标签具备哪些属性。

wandertp的博客 1284

C++智能指针数组管理全攻略(RAII设计模式实战精讲)

掌握RAII的智能指针数组管理,彻底解决C++内存泄漏难题。适用于动态数组、资源密集型场景,结合unique_ptr与vector实现自动释放,提升代码安全与性能。实战讲解构造与析构原理,值得收藏。

Algorift的博客 950

COMSOL仿真教程—激光烧蚀

本例使用二维模型,将来自激光的入射热通量模拟为金属表面上空间分布的热源,从而得到金属的烧蚀过程和瞬态温度分布。

qq_40977332的博客 2万+

RAII在实际项目中的应用(智能指针数组管理全攻略)

掌握RAII的智能指针数组管理,高效解决C++资源泄漏难题。适用于动态数组、大型项目等场景,通过std::unique_ptr和std::shared_ptr实现自动内存管理,提升程序稳定性与性能。方法实用,代码安全,值得收藏。

Instrustar的博客 252

Microsemi Libero系列教程(二)——新建点灯工程

前言 上一篇文章,介绍了Microsemi Libero系列教程(一)-Libero开发环境介绍,下载,安装与注册,作为嵌入式开发中的Hello World,点灯是再也基础不过的实验了,通过点灯实验,可以了解芯片GPIO的控制和开发环境IDE新建工程的流程,对于FPGA来说,每个IO口几乎一样,所以本篇文章主要学习一下如何基于Microsemi Libero集成开发环境建立一个示例工程,让一个L...

whik1194的博客 1万+

【FDTD】仿真目录(共计 16 篇)

对于完美吸收型边界条件,有时候我们需要设置将仿真结构穿过边界条件区域,具体原因可以阅读下文。在进行 S 参数扫描时,当考虑到材料的色散特性时,我们可以如下文一样选择计算群延迟。仿真,我们需要构建仿真结构与仿真区域,对于它们的尺寸,应该遵循下文进行设定。中存在多种不同的网格类型,具体可以参考下文,这部分内容仅作了解即可。尺寸的设置问题,对于 mesh 的最小尺寸,可以参考下文。的边界条件设置也十分重要,下文中我们对边界条件进行总结。仿真中我们可以设定参与仿真的模式数量,可以参考下文。尺寸的实例,详见下文。

u011699626的博客 504

微软C++开发全攻略:从Visual Studio工具链到核心语法与面试实战

C++作为一门高性能系统编程语言,其核心在于对内存、资源和并发的精细控制。理解其内存管理机制(如智能指针的RAII原理)、标准模板库(STL)的数据结构与算法、以及多线程同步原语,是构建高效可靠软件的基础。这些技术在现代软件开发中价值显著,尤其在需要极致性能的Windows平台、游戏引擎、后端服务等场景。本文将聚焦微软技术栈,深入解析Visual Studio IDE的高效调试技巧和MSVC编译器的标准兼容与扩展特性,并结合vcpkg库管理工具,展示如何在实际工程中应用这些C++核心知识,解决从日常开发到技

weixin_34025151的博客 429

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【C++智能指针】深入探究C++智能指针:自定义删除器的设计与选择

在C++编程中,内存管理一直是一个不可或缺的话题。传统的C++程序员依赖`new`和`delete`(新建和删除)来手动管理内存,但这种方式容易导致内存泄漏或是双重释放等问题。这就是智能指针(Smart Pointers)登场的原因。 智能指针不仅仅是一个指针,它是一个对象,拥有生命周期(Lifetime)。当智能指针的生命周期结束时,它会自动释放所拥有的资源。这种自动管理机制极大地减少了程序员的负担,也降低了出错的可能性。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 1858

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【C++】定制删除器 + 类型转换

上一章节我们学习了智能指针,我们可以将对象托管给智能指针管理,通过智能指针来释放资源空间。但是每个资源的释放的方式是不一样的,而我们之前实现的智能指针释放资源的方式单一,那我们该如何解决呢?下面来絮叨絮叨~~🙋🙋🙋🙌传送门。

上上谦. 的博客 862

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

智能指针与自定义删除器

C++智能指针(unique_ptr和shared_ptr)通过自定义删除器扩展资源管理能力。unique_ptr独占资源,轻量高效;shared_ptr共享资源,引用计数管理。自定义删除器适用于特殊释放场景(如数组、C库资源等),支持函数指针、lambda、函数对象和std::function四种形式。最佳实践包括:优先使用unique_ptr、利用make_函数创建、lambda删除器、正确处理数组资源,以及避免原始指针多次创建shared_ptr。代码示例展示了文件句柄、数组和数据库连接等实际应用场景

weixin_43479242的博客 621

C++ primer 学习笔记-智能指针自定义删除器

C++ primer 学习笔记-智能指针自定义删除器

转载和创作优秀的博客 500

c++定制删除器

定制删除器其实是利用仿函数 一、仿函数是什么? 不是函数但可以像函数一样使用,因为重载了operator() 简单举例: template struct Less { bool operator()(const T& l, const T& r) { return l < r; } }; void Test2() { Lessless1; cout << less1(1,

Everlasting2016的博客 1505

C++智能指针自定义删除器

智能指针支持用户自定义删除方法,默认为delete或者delete[],不过当我们用一个裸指针定义一个智能指针,而裸指针指向的内存是malloc出来的时候,显然用delete删除会出问题,比如。 struct A { int a,b; int*p; A() { p=(int*)malloc(sizeof(int)); } ~A() { free(p); } }; int...

CL_XYZ 2988

C++ - 智能指针(smarter pointer)自定义删除器(deleter) 的方法 详解 及 代码

智能指针(smarter pointer)自定义删除器(deleter) 的方法 详解 及 代码 版权所有, 禁止转载, 如有需要, 请站内联系 本文地址: http://blog.youkuaiyun.com/caroline_wendy 智能指针包含两种"shared_ptr"和"unique_ptr", 由于两种指针的实现方式不同, 所以传递删除器的方式也不同; ...

weixin_34187862的博客 898
上一篇: StackOverflowError不再怕:掌握这4个JVM参数让你从容应对
下一篇: 哈希冲突导致程序崩溃?90%开发者忽略的unordered_map陷阱,你中招了吗?
DevPath
博客等级 码龄1年 179粉丝 2176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值