# learn_c_and_cpp **Repository Path**: Z_xw/learn_c_and_cpp ## Basic Information - **Project Name**: learn_c_and_cpp - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-04 - **Last Updated**: 2026-03-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 说明 这是第二次学习 c/c++ 在 [这里](https://gitee.com/Z_xw/language-c.git) 是第一次学习, 只学习了一些基础知识, 完成了一些《The C Programming Language》的练习题, 学了一些Cmake 知识。 这次再看《The C Programming Language》是为了学习 C++ 做一些铺垫。 计划如下: 1. 再完成一遍 《The C Programming Language》 中的练习题, 对照上一次的笔记, 复习c的特性,依然不必过于入了解, 只是为了给c++ 铺垫。(6周) 2. 找一本c++ 的书,或者 learncpp.com 上学习, 但是这个网站是英文的,难度有点大。(12周) 3. 差不多之后 ,使用c++ 与 imgui , 写一个工具, 可以控制 nginx(启动,停止,reload), 可以完成 chrome cdp 生成 pdf . 可以创建一个 server (4周) 4. 可以编译 chromium, 并自己扩展功能, 增加页面, 即有web的灵活, 又有 c++的高效 (。。) ## 为什么 只用栈变量、静态存储、字符串字面量时,不需要 free 因为 free 只对一类内存有效:堆内存(heap),也就是由 malloc/calloc/realloc(或等价分配函数)返回的指针。 栈变量(automatic storage):函数进入作用域时自动分配,离开作用域自动回收。 静态存储(static/global):程序启动时分配,进程结束时由系统回收。 字符串字面量:通常放在只读静态区,生命周期贯穿整个程序。 所以这些都不是你“手动申请”的堆内存,自然也不该你 free。 反过来,若对它们调用 free,属于未定义行为(可能崩溃、内存破坏、偶尔看似没事但隐患很大)。 可以记成一句口诀: 谁 malloc,谁 free;不是 malloc 来的,绝不 free。 ## C 项目内存管理最小规范(5条) 1. 栈优先,堆兜底 小对象、短生命周期优先放栈上;只有在“运行时大小不确定 / 生命周期跨作用域 / 需要共享”时才用 `malloc`。 2. 所有权必须单一且可追踪 任一堆对象在任意时刻只允许一个明确 owner;接口必须写明是“借用(borrow)”还是“转移(take ownership)”。 3. 谁分配,谁释放(除非显式转移) 默认规则:`malloc/calloc/realloc/strdup` 的调用方负责 `free`。若发生所有权转移,必须在函数名或注释中写清楚。 4. 成对 API 命名,统一清理出口 统一使用 `xxx_create/xxx_destroy` 或 `xxx_init/xxx_deinit`。函数内多处返回时,使用单一 `cleanup` 路径,避免遗漏释放。 5. 释放后置空,失败要可回滚 `free(p); p = NULL;`;部分分配失败时必须释放已成功分配的资源,保证函数失败后不泄露。 --- ### 建议的函数注释模板(ownership) ```c // @param in 借用参数,函数不持有、不释放 // @param out 调用方提供缓冲区,函数只写入 // @return 新分配对象(caller owns),调用方必须 free/xxx_destroy ``` 按这个规范执行时,可以把内存问题从“全局紧张”降成“接口处一次性说清楚”。