cpp自学 day9 (程序内存模型)

码云上传代码团队协作

见网址:如何提交代码到gittee(码云)详细教程(小白专属) - 知乎https://zhuanlan.zhihu.com/p/676496360

全局区域:

局部变量和全局变量在内存中占的位置不同,我们暂时定为两个区域:全局区和局部区

静态变量:

普通变量前面加static

数据存储位置与全局变量相近,属全局区

字符串常量:

“”双引号引起来的就叫字符串常量

数据存储位置与全局变量相近,属全局区

const修饰的变量:

const修饰的全局常量:属全局区

const修饰的局部常量:属局部区

内存运行后.........

栈区

栈区数据注意事项:不要返回局部变量的地址。

由编译器自动分配释放,存放函数的参数值,局部变量等。

例子

形参数据也会放在栈区开辟一个内存

堆区

由程序员分配释放,若程序员不释放,程序结束时由操作系统回收。

在C++中主要利用new在堆区开辟内存

原理

除非我关闭程序运行窗口,否则堆区数据不会释放

AI整理版:

C++ 内存管理笔记

1. 内存分区

C++程序运行时,内存通常分为以下几个区域:

1.1 全局区(静态区)
  • 存储内容

    • 全局变量

    • 静态变量(static修饰的变量)

    • 字符串常量(如"Hello, World!"

    • const修饰的全局常量

  • 特点

    • 生命周期为整个程序运行期间。

    • 在程序编译时分配内存,程序结束时释放。

1.2 栈区
  • 存储内容

    • 局部变量

    • 函数参数

    • const修饰的局部常量

  • 特点

    • 由编译器自动分配和释放。

    • 生命周期为函数调用期间。

    • 注意事项:不要返回局部变量的地址,因为函数调用结束后,栈区内存会被释放。

1.3 堆区
  • 存储内容

    • 动态分配的内存(使用newmalloc

  • 特点

    • 由程序员手动分配和释放(使用deletefree)。

    • 生命周期由程序员控制,直到显式释放或程序结束。

    • 注意事项:忘记释放堆区内存会导致内存泄漏。

1.4 常量区
  • 存储内容

    • 字符串常量(如"Hello, World!"

  • 特点

    • 数据不可修改。

    • 生命周期为整个程序运行期间。

1.5 代码区
  • 存储内容

    • 程序的二进制代码(函数体、类方法等)。

  • 特点

    • 只读,不可修改。


2. 变量存储位置总结

变量类型存储区域生命周期备注
全局变量全局区整个程序运行期间
静态全局变量全局区整个程序运行期间作用域为文件内
静态局部变量全局区整个程序运行期间作用域为函数内
局部变量栈区函数调用期间
const全局常量全局区整个程序运行期间
const局部常量栈区函数调用期间
动态分配的内存(new堆区直到显式释放需要手动释放,否则内存泄漏
字符串常量常量区整个程序运行期间不可修改

3. 代码示例

#include <iostream>

int globalVar = 10; // 全局变量,存储在全局区

void func() {
    static int staticVar = 20; // 静态局部变量,存储在全局区
    int localVar = 30; // 局部变量,存储在栈区
    const int constLocalVar = 40; // 局部常量,存储在栈区

    int* heapVar = new int(50); // 动态分配内存,存储在堆区

    std::cout << "globalVar: " << globalVar << std::endl;
    std::cout << "staticVar: " << staticVar << std::endl;
    std::cout << "localVar: " << localVar << std::endl;
    std::cout << "constLocalVar: " << constLocalVar << std::endl;
    std::cout << "heapVar: " << *heapVar << std::endl;

    delete heapVar; // 释放堆区内存
}

int main() {
    func();
    return 0;
}

4. 内存管理注意事项

  1. 不要返回局部变量的地址

    int* badFunc() {
        int localVar = 10;
        return &localVar; // 错误:局部变量地址在函数结束后无效
    }

  2. 避免内存泄漏

    • 使用new分配的内存必须用delete释放。

    • 使用malloc分配的内存必须用free释放。

  3. 野指针问题

    • 释放内存后,将指针置为nullptr,避免野指针。


码云团队协作笔记

1. 码云(Gitee)简介

  • 码云是国内常用的代码托管平台,类似于GitHub。

  • 支持Git版本控制,适合团队协作开发。

2. 团队协作流程

  1. 创建仓库

    • 在码云上创建一个新的仓库。

  2. 克隆仓库

    git clone https://gitee.com/your-username/your-repo.git
  3. 创建分支

    • 每个开发者基于mainmaster分支创建自己的开发分支

    git checkout -b feature-branch
  4. 提交代码

    • 在本地完成开发后,提交代码到本地仓库。

    git add .
    git commit -m "描述你的更改"
  5. 推送代码

    • 将本地分支推送到远程仓库。

    git push origin feature-branch
  6. 创建Pull Request(PR)

    • 在码云上创建PR,请求将feature-branch合并到main分支。

  7. 代码审查

    • 团队成员对PR进行审查,提出修改建议。

  8. 合并代码

    • 审查通过后,合并PR到main分支。

3. 常用Git命令

  • 查看状态:

    git status
  • 查看提交历史:

    git log
  • 拉取远程更新:

    git pull
  • 切换分支:

    git checkout branch-name
  • 删除分支:

    git branch -d branch-name

单元测试框架练习 背景: 2020年12月31日,某品牌拖地机器人由于时间戳被错误地置为13月1日,导致当日无法正常使用(https://www.zhihu.com/question/437791481/answer/1659932774)。 任务1: 给定以下一个用C++语言编写的NextDate函数的骨架,其功能为:在输入一个合法的日期后,计算该日期下一天的年、月、日并直接通过参数返回。请补全该程序(不得改变函数接口)。 void NextDate(int &year, int &month, int &day) { if(!ValidDate(year, month, day)){ return false; } else{ if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10){ if(day == 31){ ... } else{ ... } } else if(month == 4 || month == 6 || month == 9 || month == 11){ ... } else if(month == 12){ ... } else{ if((LeapYear(year) && day == 29) || (!LeapYear(year) && day == 28)){ ... } else{ ... } } } } 注意,用于判断输入合法性的ValidDate函数以及用于判断平年闰年的LeapYear函数请自行实现。 任务2: 使用GTest单元测试框架对补全后的NextDate函数进行测试。根据PIE模型的原理需要确保NextDate函数中所有的代码行均被执行过至少一次(整个if语句看作一行不考虑短路计算)。 注意,GTest单元测试框架的使用请通过中国大学MOOC平台线上自学。相关课程内容已发布。 任务3: 思考某品牌拖地机器人在2020年12月31日所出现的那个bug,推测一下可能的原因是什么,在NextDate函数中出现什么样的fault可能会导致这样的failure。给出这个错误版本的NextDate函数。 任务4: 思考什么样的测试用例可以检测任务3中构造的错误?使用GTest单元测试框架编写测试用例检测这个错误。 提交要求: 所有任务均以代码的形式提交。
06-25
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值