从零开始的C++学习生活 5:内存管理和模板初阶

信息学奥赛入门:C++编程与算法思维培养的三年教学实践 编程学习与算法思维培养是计算机科学教育的核心基础。其原理在于通过系统化的逻辑训练,将复杂问题分解为计算机可执行的指令序列,从而提升问题解决能力。掌握编程语言(如C++)和基础算法(如排序、枚举、递归)的技术价值在于构建坚实的计算思维,这是参与信息学奥赛(NOI/CSP)和从事软件开发等领域的必备素养。应用场景广泛,从中学信息技术竞赛到大学计算机专业学习,乃至各类逻辑密集型行业的技能提升,都离不开这一基础。本文聚焦于信息学奥赛入门教学,通过精心设计的知识图谱与学习路径,结合大量贴近生活的比喻和可运行的代码示例 阅读详情

个人主页:Yupureki-CSDN博客

C++专栏:C++_Yupureki的博客-CSDN博客

目录

前言

1. C语言的内存管理

1.1 内存区域分布

1.2 malloc/calloc/realloc对比

1.3 常见错误

2. C++的新内存管理方式

2.1 new和delete

2.2 new和delete操作自定义类型

3. operator new与operator delete

4. malloc/free和new/delete的区别

 对比总结表

5. 泛型编程:为什么需要模板?

6. 函数模板

6.1 函数模板的概念

6.2 函数模板的格式

6.3 函数模板的原理

6.4 函数模板的实例化

隐式实例化

显式实例化

6.5 模板参数的匹配原则

7. 类模板

7.1 类模板的定义

3.2 类模板的实例化


前言

C语言中,malloc开辟空间大小需要我们自己去计算,也不能初始化每一块空间的值,有没有更加方便快捷的方法?

再之,我们常常会遇到需要处理多种数据类型的情况。例如,实现一个交换两个变量的函数,如果对每种类型都写一个重载函数,代码会显得冗余且难以维护。有没有一种方式,可以让我们只写一次代码,就能适用于多种类型呢?

在C++里,这些问题都得到了解决,new/delete和模板都是C++不可或缺,十分重要的部分。

本文将带你初步了解C++中的新的空间开辟机制和模板机制,包括函数模板和类模板的基本概念、使用方法及其原理。

1. C语言的内存管理

1.1 内存区域分布

在C/C++程序中,内存被划分为几个关键区域,每个区域都有其特定的用途和管理方式

【说明】

1. 栈又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。

2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口 创建共享共享内存,做进程间通信。

3. 堆用于程序运行时动态内存分配,堆是可以上增长的。

4. 数据段--存储全局数据和静态数据。

5. 代码段--可执行的代码/只读常量。

#include <iostream>
#include <cstdlib>
using namespace std;

int globalVar = 1;              // 全局变量
static int staticGlobalVar = 1; // 静态全局变量

void Test() {
    static int staticVar = 1;    // 静态局部变量
    int localVar = 1;           // 局部变量
    
    int num1[10] = {1, 2, 3, 4}; // 局部数组
    char char2[] = "abcd";       // 局部字符数组
    const char* pChar3 = "abcd"; // 指向常量字符串的指针
    
    int* ptr1 = (int*)malloc(sizeof(int) * 4);  // 动态分配
    int* ptr2 = (int*)calloc(4, sizeof(int));   // 动态分配并初始化为0
    int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4); // 重新分配
    
    free(ptr1);
    free(ptr3);
}

1.2 malloc/calloc/realloc对比

#include <iostream>
#include <cstdlib>
using namespace std;

void TestCMemory() {
    // malloc - 分配指定字节数的内存,不初始化
    int* p1 = (int*)malloc(sizeof(int) * 4);
    
    // calloc - 分配并初始化为0
    int* p2 = (int*)calloc(4, sizeof(int));  // 分配4个int,初始化为0
    
    // realloc - 重新分配内存大小
    int* p3 = (int*)realloc(p2, sizeof(int) * 10);
    
    // 注意:p2已被realloc处理,不需要再free
    free(p1);
    free(p3);  // 释放重新分配后的内存
}

三种函数的区别:

函数初始化参数形式使用场景
malloc不初始化malloc(size)普通内存分配
calloc初始化为0calloc(count, size)需要零初始化的数组
realloc保持原数据realloc(ptr, new_size)调整已分配内存大小

1.3 常见错误

内存泄漏(未使用free),重复释放(多次使用free),解引用野指针(读取已释放空间的数据)和越界访问都是常见的错误

void MemoryErrors() {
    // 1. 内存泄漏
    int* leak = (int*)malloc(sizeof(int) * 10);
    // 忘记free(leak)
    
    // 2. 重复释放
    int* p = (int*)malloc(sizeof(int));
    free(p);
    // free(p);  // 错误:重复释放
    
    // 3. 使用已释放内存
    int* q = (int*)malloc(sizeof(int));
    free(q);
    // *q = 10;  // 错误:野指针
    
    // 4. 越界访问
    int* arr = (int*)malloc(sizeof(int) * 5);
    // arr[5] = 10;  // 错误:越界访问
    free(arr);
}

2. C++的新内存管理方式

C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因 此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。

2.1 new和delete

#include <iostream>
using namespace std;

void TestCPPMemory() {
    // 申请单个int空间
    int* ptr1 = new int;
    
    // 申请单个int空间并初始化为10
    int* ptr2 = new int(10);
    
    // 申请10个int类型的空间(数组)
    int* ptr3 = new int[10];
    
    // 申请数组并初始化(C++11)
    int* ptr4 = new int[10]{1, 2, 3};  // 前3个初始化,其余为0
    
    cout << "*ptr2 = " << *ptr2 << endl;  // 输出:10
    
    // 释放内存
    delete ptr1;
    delete ptr2;
    delete[] ptr3;  // 数组要用delete[]
    delete[] ptr4;
}

new为操作符,和malloc或者calloc相似,后面跟要开辟空间数据的类型和大小。如果要以数组的形式开辟则加[],里面加大小,后面的{}可以初始化前n个数据的大小。

delete为操作符,和free相似。如果是单个数据则直接用delete释放空间;如果是数组,那么最好加上[](这里不加也不会报错,但如果是类类型,那么极有可能出错)

2.2 new和delete操作自定义类型

当new和delete为自定义类型开辟空间时,则会自动调用对应的构造函数和析构函数

而内置类型不会,毕竟都没有构造函数和析构函数

class MyClass {
public:
    MyClass(int val = 0) : data(val) {
        cout << "构造函数: " << this << ", data = " << data << endl;
    }
    
    ~MyClass() {
        cout << "析构函数: " << this << ", data = " << data << endl;
    }
    
private:
    int data;
};

void TestDifference() {
    // C++方式:分配内存并调用构造函数
    MyClass* p2 = new MyClass(42);
    delete p2;  // 调用析构函数并释放内存
    
    cout << "=== 数组操作 ===" << endl;
    // 对象数组
    MyClass* p3 = new MyClass[3];  // 调用3次构造函数
    delete[] p3;                   // 调用3次析构函数
}

如果以数组的形式为自定义类型开辟空间,那么开辟了几个元素的空间,就会调用几次的构造函数和析构函数

3. operator new与operator delete

在C++中,new和delete只是用户进行动态内存申请和释放的操作符

在运用当中会分别调用对应的operator new与operator delete函数

void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{
  while ((p = malloc(size)) == 0)//new的底层其实是调用malloc
  //.......
}

void operator delete(void *pUserData)
{
  _free_dbg( pUserData, pHead->nBlockUse );//delete的底层是调用free
  //.......
}

#define  free(p)    _free_dbg(p, _NORMAL_BLOCK)

如果观察这两个函数的内容,则会发现其实就是malloc和free套了个马甲,本质还是使用malloc和free。如果 malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施 就继续申请,否则就抛异常。

4. malloc/free和new/delete的区别

malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。

不同的地 方是:

1. malloc和free是函数,new和delete是操作符

2. malloc申请的空间不会初始化,new可以初始化

3. malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可, 如果是多个对象,[]中指定对象个数即可

4. malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型

5. malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常

6. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new 在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成 空间中资源的清理释放

 对比总结表

特性malloc/freenew/delete
语言C函数C++操作符
初始化不初始化可初始化
大小计算手动计算自动计算
类型安全需要强转类型安全
错误处理返回NULL抛出异常
构造/析构不调用自动调用
重载不可重载可重载
数组需要手动处理专用语法

5. 泛型编程:为什么需要模板?

在没有模板的情况下,如果我们想实现一个通用的交换函数,可能会写出如下代码:

void Swap(int& left, int& right) {
    int temp = left;
    left = right;
    right = temp;
}

void Swap(double& left, double& right) {
    double temp = left;
    left = right;
    right = temp;
}

void Swap(char& left, char& right) {
    char temp = left;
    left = right;
    right = temp;
}

这种方式虽然可行,但存在明显的问题:

  • 代码冗余:每个函数体几乎相同,只是类型不同。

  • 不易维护:新增类型时需要手动添加函数,容易出错。

我们希望能有一个“模具”,让编译器根据我们传入的类型自动生成对应的函数代码。这就是模板的由来。

6. 函数模板

6.1 函数模板的概念

函数模板是一个通用的函数蓝图,它不具体指定类型,而是在使用时根据传入的实参类型自动实例化出具体的函数版本。

6.2 函数模板的格式

template<typename T>
void Swap(T& left, T& right) {
    T temp = left;
    left = right;
    right = temp;
}
  • template<typename T> 表示定义一个模板,T 是一个占位符类型。

  • 你也可以使用 class 代替 typename,但不能用 struct。

6.3 函数模板的原理

函数模板本身不是函数,而是编译器生成具体函数的“模具”。当我们调用 Swap(a, b) 时,编译器会根据 a 和 b 的类型推导出 T,然后生成对应的函数代码。

int main() {
    int i1 = 10, i2 = 20;
    Swap(i1, i2);  // 生成 void Swap(int&, int&)

    double d1 = 1.1, d2 = 2.2;
    Swap(d1, d2);  // 生成 void Swap(double&, double&)
}

6.4 函数模板的实例化

使用函数模板时,编译器会根据传入的实参类型生成具体的函数,这个过程称为实例化。实例化分为两种:

隐式实例化

编译器自动推导类型:

Add(1, 2);     // T 被推导为 int
Add(1.1, 2.2); // T 被推导为 double
显式实例化

手动指定类型:

Add<int>(1, 2.2);  // 将 2.2 强制转换为 int

6.5 模板参数的匹配原则

  • 如果存在非模板函数与模板函数同名,且参数匹配,优先调用非模板函数。

  • 如果模板能生成更匹配的版本,则选择模板。

  • 模板不支持隐式类型转换,而普通函数支持。


7. 类模板

7.1 类模板的定义

类模板允许我们定义一种通用的类,其成员类型可以是参数化的。

template<typename T>
class Stack {
public:
    Stack(size_t capacity = 4) {
        _array = new T[capacity];
        _capacity = capacity;
        _size = 0;
    }

    void Push(const T& data);

private:
    T* _array;
    size_t _capacity;
    size_t _size;
};

// 类外定义成员函数
template<class T>
void Stack<T>::Push(const T& data) {
    // 扩容逻辑
    _array[_size] = data;
    ++_size;
}

7.2 类模板的实例化

类模板的实例化必须在类名后加上 <类型>:

Stack<int> st1;        // 存储 int 类型的栈
Stack<double> st2;     // 存储 double 类型的栈

注意:Stack 是模板名,Stack<int> 才是具体的类型名。

12个AI工程化工具:让软件真正‘长脑子’的分层施工图 在AI落地实践中,‘让软件智能’本质是构建可部署、可监控、可演进的工程系统,而非堆砌模型。其核心在于分层解耦:感知层(CV/NLP)将非结构化数据转化为结构化信号,认知层(LLM/Agent)实现语义理解与生成,协同层(RAG/Workflow)桥接AI能力与业务逻辑,治理层(Prometheus/W&B/K8s)保障生产稳定性。Sentence Transformers和Llama.cpp等工具之所以关键,正因其在向量化精度、本地推理可控性、低延迟编排等真实工程瓶颈上提供了确定性解法。本文聚焦SaaS、金 阅读详情

相关推荐

使用C++与Qt开发鬼谷八荒属性修改器的实战指南

本文是一份详细的实战指南,教你如何使用C++与Qt框架开发《鬼谷八荒》游戏属性修改器。内容涵盖从开发环境搭建、利用Cheat Engine进行内存地址逆向分析,到使用Qt Designer设计图形界面,并最终通过Windows API实现内存读写功能。项目旨在通过实践巩固C++系统编程与GUI开发技能,深入理解进程内存管理。

weixin_29018335的博客 730

C++ std::stack 容器适配器:从 LIFO 原理到工程实践

栈(Stack)是一种遵循后进先出(LIFO)原则的基础数据结构,在计算机科学中广泛应用于函数调用、表达式求值和深度优先搜索等场景。其核心原理在于只允许在栈顶进行插入和删除操作,确保了常数时间复杂度 O(1) 的高效性。在 C++ 标准模板库(STL)中,std::stack 并非独立容器,而是一个容器适配器,它基于 deque、vector 或 list 等底层容器,通过封装仅暴露 push、pop、top 等栈操作接口,实现了数据的安全访问与逻辑隔离。这种设计体现了适配器模式的思想,在复用现有组件的同时

weixin_30596735的博客 354

本地AI健康助手ECHO:基于智能体架构的隐私安全健康管理实践

智能体(Agent)作为人工智能领域的重要分支,通过感知、规划、执行和学习的闭环机制,模拟人类决策过程,实现自主任务完成。其核心原理在于将大语言模型的推理能力与外部工具调用相结合,形成可行动的智能系统。在技术价值上,智能体架构能够处理复杂、多步骤的任务,显著提升了AI系统的实用性和自动化水平。在应用场景中,尤其在健康管理这类对隐私、连续性和安全性要求极高的领域,智能体技术展现出独特优势。本文探讨的ECHO项目,正是将智能体与本地向量数据库、时序记忆和安全护栏深度融合,构建一个完全在本地运行的、具备代理行为能

weixin_34414196的博客 548

C++栈数据结构:从原理到实战,掌握std::stack与经典算法

栈是一种遵循后进先出原则的基础数据结构,其核心操作包括入栈、出栈和访问栈顶元素。在计算机科学中,栈不仅是管理函数调用、实现递归的关键机制,也是解决表达式求值、括号匹配等经典算法问题的利器。对于C++开发者而言,深入理解栈的原理与实现,能有效提升程序设计的逻辑思维与问题解决能力。本文通过剖析std::stack的容器适配器设计,并结合动态数组与链表两种底层实现方案,帮助读者从概念到实践全面掌握栈的应用。文中还涵盖了栈在函数调用、递归以及单调栈等高级场景中的技术价值,为学习数据结构和算法打下坚实基础。

weixin_33770878的博客 317

重读2007年Objective-C前言:iOS开发的底层契约与精神源流

Objective-C是苹果早期iOS生态的基石语言,其核心在于C语言的底层控制力与Smalltalk面向对象思想的融合。它通过Runtime动态消息机制、toll-free bridging跨框架互通、协议(Protocol)驱动的鸭子类型等设计,构建了高度灵活又强约束的开发范式。这种‘契约优先’的思想深刻影响了后续Swift的内存所有权模型、Delegate向AsyncSequence的演进,以及UIKit到SwiftUI的架构迁移。理解Objective-C并非怀旧,而是掌握iOS平台级开发的本质逻辑

chuji3953的博客 418

操作系统面试通关攻略:从进程调度到手写锁的底层原理与实践

操作系统是计算机系统的核心,面试中常围绕进程与线程、死锁、内存管理、调度算法等基础概念展开。理解进程是资源分配的基本单位,线程是CPU调度的最小单位,而协程则通过用户态协作式调度解决高并发IO场景的瓶颈。死锁的四个必要条件与银行家算法、虚拟内存的页表与TLB缺页流程、生产者消费者模型的条件变量实现,都是高频考点。掌握这些原理,不仅有助于面试,更能指导实际工程中的性能调优与故障排查。从Linux常用命令到手写自旋锁,再到国产操作系统的生态演进,系统性地构建知识框架,才能在面试中从容应对。本文从基础概念切入,结

weixin_33768481的博客 348

从零开始的C++学习生活 19:C++复习课(5.4w字全解析)

本文是一篇C++复习指南,系统性地总结了C++的核心语法和特性。主要内容包括: C++基础语法:命名空间、引用、函数重载、内联函数和nullptr等新特性; 面向对象编程:类和对象、继承与多态、运算符重载、友元关系等; 内存管理:new/delete与malloc/free区别、内存泄漏问题及智能指针解决方案; 模板编程:函数模板、类模板及其特化; C++11新特性:范围for循环、右值引用、lambda表达式和包装器等; 异常处理机制和智能指针原理。 文章通过大量代码示例详细讲解了各个知识点

qq_49648783的博客 1338

DeepSeek-Coder-V2本地部署实战:MoE架构+160K上下文+Ollama一键集成

代码大模型正从通用问答走向垂直工程化——MoE(Mixture of Experts)架构通过稀疏门控实现任务级算力动态分配,显著提升代码补全、错误定位等场景的推理效率与精度;160K超长上下文则真实覆盖多文件调试、框架源码阅读与文档协同等开发刚需。结合Ollama的OpenAI兼容API、自动量化与CUDA隔离能力,开发者无需编译、不冲突环境、不上传代码,即可在VS Code、终端或Python脚本中无缝调用deepseek-coder-v2,真正实现‘本地即生产’的代码智能协作者。本文聚焦python生

weixin_30326741的博客 513

C++模板栈实现:从STL设计到泛型编程实践

泛型编程是C++的核心特性之一,它通过模板技术实现代码的通用性,允许开发者编写与数据类型无关的算法和容器。其原理是利用编译期多态,在编译时根据具体类型生成特化代码,从而在保证类型安全的同时避免运行时开销。这种技术价值在于极大提升了代码的复用性和可维护性,是构建大型软件系统的基础。在工程实践中,泛型编程广泛应用于标准模板库(STL)的设计,如容器、迭代器和算法等组件。以栈(Stack)这一基础数据结构为例,通过实现一个模板化的栈容器,可以深入理解STL中容器适配器的设计模式,特别是如何利用底层序列容器(如de

weixin_30268921的博客 288

C语言函数声明与定义:编译器视角的契约本质

函数声明是C语言分离编译模型中的核心契约机制,它在编译阶段提前约定函数接口(参数类型、数量、返回值),使编译器能静态校验调用合法性,避免运行时类型错配;函数定义则提供具体实现,二者共同支撑多文件项目的模块化构建。这种声明/定义分离的设计,直接决定了头文件(.h)与源文件(.c)的职责边界,并成为链接器解析符号依赖、解决undefined reference错误的前提。理解该机制,是掌握C语言工程化开发、VSCode多文件编译配置及Makefile构建演进的基础。

weixin_33738982的博客 1614

即梦文生视频逆向接口部署使用

有的小伙伴不知道这个地址如何填写,你可以理解是步骤3上提供的 服务器或者本地电脑IP 地址(不要写 http://127.0.0.1 或者http://localhsot ) 是 (192.168.XXX.XXX 参考)

weixin_44245188的博客 3177

C++栈数据结构实现:从原理到实战应用

栈是一种遵循后进先出原则的线性数据结构,其核心操作包括入栈和出栈。在计算机科学中,栈不仅是基础的数据结构,更是理解程序运行机制的关键,例如函数调用栈和递归的实现都依赖于栈的原理。栈的技术价值在于它能够高效处理具有嵌套或顺序依赖关系的问题,如括号匹配、表达式求值等场景。通过C++实现栈,可以深入理解其内部工作原理,包括动态内存管理和深拷贝等关键编程技术。本文以栈溢出和内存管理为切入点,详细讲解了如何用C++从零构建一个健壮的栈,并探讨了其在算法和工程实践中的具体应用。

weixin_30301449的博客 408

雷赛控制卡全方位使用指南:从硬件连接到高级应用

雷赛控制卡以其接口简单、编程便捷、性价比高的特点,成为中小自动化设备的理想选择。使用时需注意:硬件连接需注重抗干扰设计(屏蔽线、接地);软件开发需合理配置运动参数(脉冲当量、加减速);调试阶段需充分利用 DMCStudio 工具验证性能。通过本文介绍的方法,可快速实现从硬件搭建到复杂运动控制的全流程开发,满足雕刻、切割、装配等多场景的自动化需求。

品质生活,极致编程。 3729

C++ STL map/set底层实现:红黑树封装与核心原理详解

在C++编程中,关联容器是解决高效查找与键值映射问题的核心数据结构。其底层通常基于平衡二叉搜索树(如红黑树)实现,通过维护元素的有序性,确保插入、删除和查找操作的时间复杂度稳定在O(log n)。这种设计不仅提供了稳定的性能保障,还支持高效的范围查询和有序遍历,在字典、缓存、去重等场景中具有重要技术价值。理解其封装原理,特别是迭代器设计、模板应用和内存管理,是深入掌握STL的关键。本文以红黑树为例,剖析map和set的底层实现,探讨自定义比较器、异常安全等工程实践问题,帮助开发者从API使用者转变为容器设计

weixin_34101229的博客 320

同济土木非0基础三个月跨考复旦计算机攻略

跨考cs攻略前言我cs专业课如何复习How to start from zero简历其他复试 前言 建议多去工地/化工厂涡轮增压一下 我 同济土木gpa 3.2/5 挂科 * n 辣鸡项目 * n (padding 简历) 21考复旦计算机专硕 10月-12月 学习+复习 总分392 政治 68;背肖4即可 英语二 78 裸考,(高考英语140+);做点真题,建议据自己情况准备 数学二 142 ;(高考数学接近满分);做真题+模拟题,每天写一张试卷 专业课 104 ,考试生病了,下文展开。 cs专业课

piglake的博客 7232

基于遗传算法的柔性作业车间调度(初始化以及编码策略)

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

菜鸡 8584

C++栈与队列:原理、实现与应用全解析

栈(Stack)和队列(Queue)是计算机科学中最基础的线性数据结构,遵循LIFO(后进先出)和FIFO(先进先出)原则。从操作系统函数调用栈到消息队列系统,这两种数据结构在底层系统和高层应用中无处不在。C++标准库(STL)将其实现为容器适配器,基于deque或list等序列容器构建,既保证了接口统一性又提供了实现灵活性。理解栈与队列的核心原理,掌握其在表达式求值、BFS算法、撤销操作等场景的应用,是每位开发者必备的技能。特别是在处理多线程任务调度、内存管理等系统级编程时,合理选择底层容器和同步策略对性

chuannaoxuan4674的博客 372

PCIe信号眼图总是不开?手把手教你调CTLE和DFE参数(附实测波形对比)

本文详细解析了PCIe信号眼图调试中CTLE和DFE参数的优化方法,帮助硬件工程师解决眼图无法张开的问题。通过实际案例和步骤指导,介绍了如何调整CTLE直流增益和DFE抽头系数,提升接收端均衡器性能,确保信号完整性。

weixin_26805597的博客 209

C++ shared_ptr底层揭秘:_Ref_count引用计数派生类设计原理

shared_ptr是C++中实现自动内存管理的核心智能指针,其可靠性根植于底层引用计数机制。该机制并非简单原子变量,而是通过_Ref_count、_Ref_count_del、_Ref_count_del_alloc等派生类构成的正交分层结构,分别承载基础计数、自定义删除器和分配器支持三大职责,严格遵循零开销抽象原则。其设计融合了虚函数按需启用、双原子计数器(_M_use_count与_M_weak_count)分离以降低缓存争用、完美转发保障删除器语义安全、以及make_shared的连续内存分配优化等

weixin_33862993的博客 399

树莓派4B网线直连Windows全流程:从IP查询到SSH登录避坑指南

本文提供了一份详细的树莓派4B通过网线直连Windows电脑的实战指南。核心步骤包括配置Windows网络共享、查询树莓派IP地址以及通过SSH进行安全登录与初始配置。文章深入解析了直连的网络原理,并重点分享了使用CMD命令和工具定位IP、避免常见错误的避坑技巧,帮助用户在没有显示器或路由器的环境下快速完成树莓派初始化。

grape的博客 1078

基于STM32F103的智能门禁门锁门卫系统设计

本文设计了一种基于STM32F103单片机的智能门禁系统,集成了密码、射频IC卡和指纹识别三种验证方式。系统采用模块化设计,包含MFRC522射频模块、AS608指纹模块、矩阵键盘、OLED显示和舵机控制等硬件,实现了身份验证、密码修改、IC卡/指纹管理以及安全防护功能。测试结果表明系统响应迅速(密码验证250ms、指纹验证600ms)、功耗低(待机50mA),且具备掉电密码保存功能。该系统操作简便、功能完善,适用于家庭和办公场所,具有较高实用价值。未来可扩展远程控制、人脸识别等功能以进一步提升智能化水平。

3254968421的博客 311

如何在本地运行350亿参数大模型:Qwen3.6-35B-A3B-GGUF完全指南

想要在个人电脑上运行一个350亿参数的大语言模型吗?Qwen3.6-35B-A3B-GGUF让你梦想成真!这个由阿里云开发的先进模型经过量化处理后,即使是普通硬件也能流畅运行。无论你是开发者、研究者,还是AI爱好者,这份完整指南将带你从零开始,轻松驾驭这个强大的AI助手。 ## 🎯 为什么选择Qwen3.6-35B-A3B-GGUF? 在众多开源大模型中,Qwen3.6-35B-A3B-GG

gitblog_01078的博客 440

Android AVB 分析(十三)dm-verity 设备是如何映射的?

在上一篇《Android AVB 分析(十二)嵌入式设备安全中的 dm-verity 简介》介绍 dm-verity 原理的时候,作者提供了一个 dm-verity 演示的例子。本篇我们基于 AOSP 源码 `android-13.0.0_r41` 实际编译生成的 Google Pixel 7 (“panther”) 设备的 system 分区镜像进行 dm-verity 设备验证实战。

洛奇看世界 2431

李沐深度学习代码精讲

本文系统解析了李沐深度学习代码实践,重点涵盖PyTorch基础、线性回归、Softmax回归和感知机等核心内容。文章首先详细介绍了PyTorch环境配置、张量操作和自动求导机制,然后深入讲解了从零实现和简洁实现两种方式的线性回归模型。在Softmax回归部分,详细阐述了Fashion-MNIST数据集的加载、处理和可视化方法,以及交叉熵损失函数的实现。文章还包含了感知机模型的构建和训练过程,并探讨了模型选择、过拟合和欠拟合等关键概念。通过大量代码示例和原理说明,为读者提供全面的深度学习实践指南,适合理论学习

ExraL的博客 236

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

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

ROS自定义消息和服务完整实践指南

在机器人操作系统(ROS)中,消息(Message)和服务(Service)是实现节点间通信的基础抽象,其本质是基于IDL接口定义语言的跨语言数据契约。理解.msg与.srv文件的语法规范、编译时代码生成机制(如genpy/gencpp)、以及catkin构建系统对message_generation和message_runtime的依赖管理,是保障分布式节点可靠协作的前提。这类机制支撑了异步发布/订阅(如传感器数据流)与同步请求/响应(如状态查询、任务触发)两类核心通信模式,广泛应用于导航、感知、控制等R

weixin_30875157的博客 463

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

长沙红胖子Qt·西安(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中...

长沙红胖子 Qt・西安,本人拥有省级科研团队从业背景,研发团队产出所有项目、产品方案和研发无分包、无外包、无AI代笔,长期深耕双一流体系高精尖技术配套研发。博客主动剥离复杂底层工况机理,专注沉淀高端、特种行业领域Qt工程化落地实战经验。所有内容均为个人梳理总结的通用性工程方法论,只输出可公开的普适技术思路。

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 164万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: 从零开始的C++学习生活 4:类和对象(下)
下一篇: 从零开始的C++学习生活 6:string的入门使用
Yupureki
博客等级 码龄6年 684粉丝 108原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值