[toc] # 什么是内存泄漏 由于疏忽错误导致的程序未能释放已经不再使用的内存 比如指针丢失 引用丢失 上述两种情况下没有 free 或者 delete 释放内存 这样就算一次丢失可以忽略不计,但如果一直发生,一直叠加,就会导致整个系统越来越慢 常见得几种情况 由于疏忽或者错误失去了对内存的控制 堆内存泄漏,因为堆内存是用户控制的,如果使用不当,就会发生泄露 使用 malloc、calloc、realloc、new 等分配内存时,使用完后要调用相应的 free 或 delete 释放内存,否则这块内存就会造成内存泄漏 指针重新赋值 # 例子 123char *p =...

[toc] # 类的大小计算 类的大小是指类的实例化对象的大小,用 sizeof 对类型名操作时,结果是该类型的对象的大小 计算原则: 遵循结构体的对齐原则 与普通成员变量有关,与成员函数和静态成员无关。即普通成员函数,静态成员函数,静态数据成员,静态常量数据成员均对类的大小无影响。因为静态数据成员被类的对象共享,并不属于那个具体的对象。 虚函数对类的大小有影响,是因为虚函数表指针的影响 虚继承对类的大小有影响,是因为虚基表指针带来的影响 空表的大小是一个特殊情况,空类的大小为 1, 当用 new 来创建一个空类的对象时,为了保证不同对象的地址不同,空类也占用存储空间. # 第一种情况...

[toc] 从 C++ 入手 计划学习路径参考 UE 官方文档: https://docs.unrealengine.com/4.27/zh-CN/ProgrammingAndScripting/ProgrammingWithCPP/CPPProgrammingQuickStart/ # 新建一个 Actor # 什么是 Actor 类似于 Unity 中的 GameObject, 即万物基类 (暂时这么理解,后面有变动再改) # 创建一个 C++ Actor 在 UE5 中,面板有变动.UE4 中需要通过文件创建一个新的 C 类,但是 UE5 中的路径变更为了:工具 ->...

[toc] # 什么是内存对齐 编译器将程序中的每个 "数据单元" 安排在字的整数倍的地址指向的内存之中 # 原则 结构体变量的首地址能够被其最宽基本类型成员大小与对齐基数中的较小者所整除 结构体每个成员相对于结构体首地址的偏移量 (offset) 都是该成员大小与对齐基数中的较小者的整数倍,如果有需要编译器会在成员之间加上填充字节 (internal padding) 结构体的总大小为结构体最宽基本类型成员大小与对齐基数中的较小者的整数倍,如有需要编译器会在最末的一个成员之后上加上填充字节 (trailing padding). #...

[toc] # 牵扯到的题 leetcode 94 leetcode 99 LeetCode 144 LeetCode 145 # 原题 给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。 进阶:使用 O (n) 空间复杂度的解法很容易实现。你能想出一个只使用常数空间的解决方案吗? # 题解 这道题用 O (n) 的存储空间很好解决,即中序遍历记录所有的值,然后找到其中逆序的两个值就可以了...

[toc] C++ 中类对象的建立分为两种:静态建立和动态建立。 静态建立: 由编译器为对象在栈空间上分配内存,直接调用类的构造函数创建对象,如 1A a; 动态建立:使用 new 关键字在堆空间上创建对象,底层首先调用 operator new() 函数,在堆空间上寻找合适的内存并分配;然后,调用类的构造函数创建对象。例如: 1A *p = new A(); # 限制对象只能建立在堆上 最直观的思想,避免直接调用类的构造函数,因为对象静态建立时,会调用类的构造函数创建对象,但也不能直接将构造函数设为私有,因为设为私有最后就只能使用 new() 的方法进行创建对象,而使用 new,...

[toc] # 从作用域看 # 全局变量 具有全局作用域,如果不包含目标全局变量定义的源文件需要用 extern 关键字再次声明这个全局变量 # 不能在头文件.h 中定义全局变量 如果在头文件中定义全局变量,那么这个变量会被引用数次,导致定义多次,即重复定义 # 局部变量 具有局部作用域,是自动对象 (auto) 函数执行结束,变量及变量所在内存都会被回收. # 静态全局变量 这个被坑到过 静态全局变量只有文件作用域,即它与全局变量的区别在于如果程序包含多个文件的话,它作用域定义它的文件里,即被 static...

[toc] # 【题目】 峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。 你可以假设 nums [-1] = nums [n] = -∞ 。 你必须实现时间复杂度为 O (log n) 的算法来解决此问题。 # 【题解】 这道题本质上数据量不不是很大,但是如果限制到了 lgn 就很容易想象到应该是利用二分的思想来解决。暴力方法:遍历一遍,如果一个值得左右严格大于它本身,则一定是峰值 但主要向借这道题学习一个思考方式 #...

[toc] # 基础知识 C++ 内存分区:栈、堆、全局 / 静态存储区、常量存储区、代码区 栈:存放函数的局部变量、函数参数、返回地址等,由编译器自动分配和释放 堆:动态申请的内存空间,就是由 malloc 分配的内存块,由程序员控制它的分配和释放,如果程序执行结束还没有释放,操作系统会自动回收。 全局区 / 静态存储区 (.bss 段和.data 段): 存放全局变量和静态变量,程序运行结束操作系统自动释放,在 C 语言中,未初始化的放在.bss 段中,初始化的放在.data 段中,C++ 中不再分区了 常量存储区 (.data 段) :...

[toc] # 基础知识 编译过程分为四个过程,编译 (编译预处理、编译、优化),汇编,链接 1. 编译预处理:处理以 #开头的指令 2. 编译、优化:将源码.cpp 文件翻译恒.s 汇编代码 3. 汇编:将汇编代码翻译成机器指令.o 文件 4. 链接:汇编程序生成的目标文件,即.o 文件,并不会立即执行,因为可能会出现: .cpp 文件中的函数引用了另一个.cpp 文件中定义的符号或者调用了某个库文件中的函数。那链接的目的就是将这些文件对应的目标文件连接成一个整体,从而生成可执行的程序.exe 文件。 链接分为两种: 静态链接...