内存管理

miller-tsunami2 天前
c++·算法·内存管理·模板
内存管理&模板通过new和delete操作符进行动态内存管理。注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[]。匹配起来使用。
晚风予卿云月3 天前
开发语言·c++·内存管理
【C++高并发内存池】 1.定长内存池的实现本项目为C++仿TCmalloc高并发内存池的实现,目前完成了定长内存池的按页资源申请,在单线程进程下实现了高频率申请资源的高效性与稳定性,并制定了资源回收复用机制
步步为营DotNet10 天前
c#·.net·内存管理·gc·datas
从分代预算到 DATAS:.NET GC 调优到底在调什么关于 .NET GC 的资料里,“Server GC 吞吐高、Workstation GC 延迟低”"把 GC.Collect 去掉就好了"这类结论流传得比机制本身更广。结果是在容器里把 ServerGarbageCollection 打开、堆内存翻了三倍,或者照着旧文调 GCLatencyMode 却发现毫无变化。这篇想讲清楚一件事:GC 的所有可调参数,最终都收敛到两个量上——gen0 预算和堆的回收目标。理解这两个量怎么被算出来,DATAS 的取舍也就自然清楚了。
智码看视界17 天前
开发语言·c++·深度学习·面试·内存管理·智能指针
C++智能指针全景剖析及面试20问2019年,某自动驾驶公司的感知模块在连续运行72小时后崩溃。排查发现——不是算法Bug,不是硬件故障,而是 三个shared_ptr形成了循环引用,导致GPU显存以每小时200MB的速度泄漏。72小时后,显存耗尽,整个感知管线崩溃。
007张三丰19 天前
java·c语言·c++·内存管理
C/C++ 内存管理详解:从内存分布到 new/delete 底层原理new 的底层本质是两步操作:调用 operator new 申请内存(底层用 malloc),然后在这块内存上执行构造函数。
无名猿19 天前
c++·内存管理·调试技巧·现代c++
C++ 对象内存模型:vtable 布局、多继承 vptr、RTTI 与 dynamic_cast 走查一个带虚函数的类,sizeof 往往比「把所有成员变量大小加起来」还要多 8 字节,多出来的就是隐藏的虚表指针(vptr)。这篇用真实可跑的代码把对象内存布局扒开:vptr 放在哪、多继承为什么有多个 vptr、RTTI 的 type_info 藏在 vtable 的什么位置、dynamic_cast 跨基类转换时编译器到底在做什么走查。看完你能解释「为什么 dynamic_cast 能把 Base* 转回 Derived* 甚至转到兄弟类」。
-Marks-22 天前
开发语言·c++·vector·内存管理·迭代器失效·vector底层模拟实现
【C++编程】STL容器(二)--- vector底层模拟实现(常用接口实现 | 扩容机制 | 深浅拷贝 | 迭代器失效)目录前言一、vector 的成员变量1.1 vector 是什么1.2 _start、_finish、_endofstorage 三个指针成员
无名猿25 天前
c++·性能优化·内存管理·现代c++·语法基础
移动构造与移动赋值:把资源偷过来「std::move 是什么」那一篇已经讲清楚了:它只是个类型转换,真正搬数据的是移动构造函数。这一篇换个视角,从类的实现者出发,亲手写出正确、高效的移动操作。有几个问题只有写实现时才碰得到:noexcept 为什么不是装饰、移动后源对象到底处于什么状态、移动赋值怎么处理自赋值。还有一个更隐蔽的:编译器可能压根没给你生成移动操作。
无名猿25 天前
c++·内存管理·并发编程·现代c++
shared_ptr 的线程安全边界:计数安全不等于对象安全std::shared_ptr 大概是 C++ 里被误解最多的类型。很多人听说「它的引用计数是线程安全的」,就放心地把它当全局变量、在线程之间随手赋值,然后在大压力下偶发崩溃或者计数错乱。
无名猿25 天前
c++·性能优化·内存管理·标准库·现代c++
unique_ptr 完全指南:独占所有权与零开销裸指针最大的麻烦其实不是「会忘写 delete」,而是所有权含糊不清:这段内存归谁,谁来释放,读代码的人只能猜。std::unique_ptr 把答案钉死在类型里,同一时刻只有一个 unique_ptr 拥有这块内存,要转移就必须显式写 std::move。代价几乎为零,既不比裸指针多占内存,也不比它多花时间。下面把常用接口和几个容易踩的点一起讲清。
无名猿25 天前
c++·内存管理·调试技巧·现代c++
对象构造与析构顺序全解:声明顺序、继承链与逆序析构「对象是怎么被拼出来、又怎么被拆掉的」是 C++ 里最容易想错的一件事,偏偏它贯穿所有资源管理。一个常见的坑:你在初始化列表里把成员 b 写在 a 前面,就以为 b 先构造。其实不是,先后只认声明顺序。再比如通过基类指针 delete 一个派生对象,若基类析构不是 virtual,派生部分的析构函数压根不会被调用。这篇把这几条顺序规则一条条用实跑代码钉死,配上时序图,半年后翻回来照着图就能复现。
无名猿25 天前
c++·内存管理·现代c++·踩坑记录
拷贝构造与拷贝赋值:调用时机、深浅拷贝与复制消除「为什么我这行 T b = a; 调用的是拷贝构造,而 b = a; 却是拷贝赋值?」「为什么函数按值返回明明该拷贝两次,实测却只构造了一次?」拷贝语义是 C++ 里最容易「想当然」、却处处是坑的一块。这篇不堆定义,直接上打印计数器:把拷贝构造的触发时机、深浅拷贝的后患、以及编译器悄悄做的「复制消除(copy elision)」优化,用实跑输出一条条亮出来。
无名猿1 个月前
c++·内存管理·现代c++·语法基础
裸指针还能不能用:不拥有与拥有的边界「裸指针还能不能用?」网上一边倒的答案是「别用,全换成 std::unique_ptr」。这话对,但只对了一半。C++ Core Guidelines 的真正立场更精细:裸指针(a T*)本身没有错,错的是用它去表达「所有权」。指针可以放心地当「观察者」用,只要你约定它不负责释放。这篇把「不拥有」和「拥有」的边界划清楚,并给你能直接套用的签名写法。
无名猿1 个月前
c++·内存管理·现代c++·语法基础
左值、右值、纯右值、将亡值:值类别入门你有没有写过 std::move(x) 之后发现它还能被读取,或者重载了 f(T&) 和 f(T&&) 却搞不清到底调了哪个?这些怪现象的根都在「值类别(value category)」上。C++11 起给每个表达式贴了一张隐形标签,它直接决定一个表达式能不能取地址、能不能被移动、以及重载决议时该选哪个版本。这篇把五个概念一次讲清,并用真跑出来的输出告诉你每种实参选中了哪个函数。
无名猿1 个月前
c++·内存管理·标准库·语法基础
指针算术与数组退化:数组名到底是不是指针「数组名就是指针」是 C/C++ 初学者最早听到的半句真理。说它是半句,是因为前半句在多数场合成立,后半句就会咬人:数组名在大多数表达式里会退化(decay)成指向首元素的指针,但数组类型本身和指针类型不是一回事。sizeof(arr) 拿到的是整块数组的字节数,&arr 的类型是「指向含 N 个 int 的数组的指针」。下面用编译器和 static_assert 把这件事钉死,顺便解释为什么函数参数里 int arr[10] 其实等价于 int*。
无名猿1 个月前
c++·性能优化·stl·内存管理·标准库
list 与 forward_list:链表真的比 vector 快吗「中间插入删除用链表,随机访问用数组」这条规则背了很多年,但它只说对了一半。真把十万个 int 分别塞进 std::list 和 std::vector,链表的内存占用是后者的 6 倍,顺序遍历还要慢一个数量级。原因不在复杂度(两者遍历都是 O(n)),而在每个节点的额外指针和缓存局部性(cache locality)。这篇用实测把链表的开销算清楚,也把链表真正不可替代的两个场景——迭代器失效规则与 splice 零拷贝——讲透,最后给一条能直接用的选型结论。
无名猿1 个月前
c++·性能优化·内存管理·标准库·现代c++
shared_ptr 完全指南:引用计数、控制块与开销std::unique_ptr 把「独占所有权」钉死在类型上,但现实里经常需要多个对象同时引用同一份资源:缓存、父子节点、观察者列表……这时 std::shared_ptr(共享所有权指针,shared pointer)登场。它用引用计数(reference count)记录「现在有几个人在用」,最后一个离开时才释放。这篇把控制块里到底存了什么、它比裸指针贵在哪、以及什么时候不该用它一次讲清。
凉茶钱1 个月前
c语言·开发语言·c++·内存管理·动态内存
【C++】动态内存管理完整解析:从内存划分到 new delete 底层原理目录内存管理的划分C语言中动态内存管理的方式C++内存管理方式new/delete操作内置类型new/delete操作自定义类型
无名猿1 个月前
c++·内存管理·现代c++·踩坑记录
new/delete 与 malloc/free:为什么绝对不能混用很多 C++ 新手把 new/delete 当成「C++ 版的 malloc/free」来用,结果在析构不执行、资源泄漏、甚至程序崩溃里打转。本质区别在于:new 不只是申请内存,它还调用构造函数;delete 不只是释放内存,它还调用析构函数。而 malloc/free 只认字节、不认对象。一旦把两边混着用,等于让「管生命周期的」和「只管内存的」两套机制互相越权——后果是未定义行为(undefined behavior)。本文用实跑代码把这条红线画清楚。
无名猿1 个月前
c++·内存管理·现代c++·语法基础
对象存储期全解:automatic / static / dynamic / thread「这个变量什么时候被销毁?」答案不取决于它在哪一行写的,而取决于它的存储期(storage duration)。C++ 里有四种存储期:自动(automatic)、静态(static)、动态(dynamic)、线程(thread_local)。它们常和作用域(scope)被混为一谈——但作用域只决定「名字在哪段代码里看得见」,存储期才决定「对象活到什么时候」。本文用构造/析构的真实输出把四种存储期钉死。