[初]snail关于C++指针与内存管理的一些备忘

国密证书实战:在CentOS 7上构建GmSSL私有CA与完整证书链 本文详细介绍了在CentOS 7操作系统上,使用GmSSL工具构建私有国密证书颁发机构(CA)与完整证书链的实战指南。内容涵盖从部署GmSSL、创建国密根CA、签发服务器与客户端证书,到生产环境安全加固与最佳实践的全流程,旨在帮助系统管理员和安全工程师建立统一、可控的内部国密安全通信体系。 阅读详情

snail关于C++指针与内存管理的一些备忘

Author:snail

 

有点乱,而且还在整理中~~最近一直在关注程序的内存管理~所以把一些看过的资料做个

索引,做个备忘    ---------------snail   07年3月2日

(希望璐璐看了会有点帮助,这下面的资料有任何问题都可以问我)


 

1 C++内存管理详解

http://blog.youkuaiyun.com/snailjava/archive/2007/03/02/1519069.aspx

 

一篇很不错的文章,简单易懂 。

 

 

 

2 <<C++程序设计语言(特别版)>>中关于内存的分配的一些资料

6.2.6           自由存储

 

10.4.5        自由存储

********************************************************************************************

特别是,如果知道存在有废料收集器,那些只做存储管理的析构函数就都可以去掉了:这种简化所付出的代价是可移植性,对某些程序可能增加运行时间,并有可能丧失对于其运行时间性质的可预见性

---B.S对带垃圾收器的C++的评价,真是一针见血啊!

********************************************************************************************

 

10.4.11       对象的放置

 

15.6            自由存储 

********************************************************************************************   

[虚构造函数]

“要构造一个对象,构造函数必须掌握所创建对象的确切类型。因此,构造函数不能是虚的。构造函数并不是一个普通的函数。特别是它需要与存储管理例程打交道,而且是以常规成员函数所没有的方式。因此,你不能有一个到构造函数的指针。这两个限制(上面两行红色的字)都可以通过迂回方式绕过去,方法就是定义一个函数,由它调用构造函数并返回构造起来的对象。这是很幸运的,因为创建一个对象而又不必知道其确切类型,这常常也很有意义。(snail:而且应该非常有趣J)

 

19.4.5         动态存储

 

B.3.4          分配错误

********************************************************************************************

X *p1 = new X;            //没有存储时抛出bad_alloc

X* p2 = new(nothrow) X;   //没有存储时返回0

********************************************************************************************

 

 

//参考B.S<<C++程序设计特别版>>19.4.5

#include <iostream>

#include <cstdio>

 

using namespace std;

 

int main(){

    int* p =new int[200000000];

   

    if(int *q = new(nothrow) int[200000000]){

        cout << "success!";                     //显示success至少需要多少内存?考考你

    }else{

        cout << "lost!";

    }  

   

    system("pause");

}

//我的机器跑出来是success!内存还蛮大的哦

 

 

 

3 <<effective C++>>第二章 内存管理

(snail:很喜欢书里面对内存管理的描述)

“c++中涉及到的内存的管理问题可以归结为两方面:正确地得到它和有效地使用它。好的程序员会理解这两个问题为什么要以这样的顺序列出。因为执行得再快、体积再小的程序如果它不按你所想象地那样去执行,那也一点用处都没有。“正确地得到”的意思是正确地调用内存分配和释放程序;而“有效地使用”是指写特定版本的内存分配和释放程序。这里,“正确地得到”显得更重要一些。”  --<<effective C++>>

条款5:对应的new和delete要采用相同的形式

条款6:析构函数里对指针成员调用delete

条款7:预先准备好内存不够的情况

条款8: 写operator new和operator delete时要遵循常规

条款9: 避免隐藏标准形式的new

条款10: 如果写了operator new就要同时写operator delete 。

 (重要!:条款10解释了为什么有时要重写operator new)

 

 

 

4 理解了上面1,2,3以后

如何在linux下检测内存泄漏

http://www.ibm.com/developerworks/cn/linux/l-mleak/index.html

 

一个跨平台的 C++ 内存泄漏检测器

http://www.ibm.com/developerworks/cn/linux/l-mleak2/index.html

 

 

 

5         一个内存管理的专题网站

snail: 竟然被我找到一个内存管理的专题网站!!(里面的内容非常详细啊)

http://www.memorymanagement.org/

 

The Memory Management Reference Beginner's Guide Overview

http://www.memorymanagement.org/articles/begin.html

 

FAQ

http://www.memorymanagement.org/faq.html

 

 

 

附录:一些名词解释:

stack allocation

Stack allocation means run-time allocation and deallocation of storage in last-in/first-out order.

Typically, stack allocation is perfored on top of the main stack, but one can have a separate data stack for this purpose as well, as in Forth, or even multiple ones, as in the PostScript® language.

Allocation and deallocation are typically fast, since they can be done simply by adding or subtracting the size of the block from the stack pointer.

Using only stack allocation, without heap allocation, is somewhat restrictive, as only objects whose size is known at compile-time can be returned from a procedure.

Some programming languages (such as some versions of Lisp and C) provide program-controlled stack allocation and deallocation of dynamic extent objects for efficiency, despite its being unsafe.

Similar terms: automatic storage duration.
Opposites: heap allocation; static allocation.
See also: region inference; dynamic extent.

 

static allocation

Static allocation means allocation of storage before the program starts and retention until the end.

The locations of objects are basically decided at compile-time, although they might be relocated at load-time. This implies the sizes of the objects must be known then.

Using only static allocation is restrictive, as sizes of data structures can't be dynamically varied, and procedures cannot be recursive. However, it is also fast and eliminates the possibility of running out of memory. For this reason, this scheme is sometimes used in real-time systems.

Historical note: The first high-level language, Fortran, only had static allocation to begin with. Later languages usually offer heap and/or stack allocation, but static allocation is often available as an option.

Similar terms: static storage duration.
Opposites: stack allocation; heap allocation.
See also: region inference; static memory(2).

 

heap (also known as free store, freestore)

The heap or free store is the memory(2) area managed by dynamic allocation.

This use of heap is unconnected with the data structure used by the heapsort algorithm

 

heap allocation (also known as dynamic allocation)

Heap allocation or dynamic allocation means run-time allocation and deallocation of storage in arbitrary order.

Dynamic allocation is usually for objects whose size, quantity, or lifetime could not be determined at compile-time. It is necessary to implement modern data structures, such as recursive trees and full closures.

Objects on the heap can be managed manually, as in C, or automatically, as in Lisp and JavaTM.

Opposites: stack allocation; static allocation.
See also: indefinite extent.

 

 

 

Spring Boot 3.5.4 + LangChain4j实战:用Milvus搭建企业级RAG问答系统(附阿里百炼API配置) 本文详细介绍了如何利用Spring Boot 3.5.4、LangChain4j与Milvus构建企业级RAG问答系统。内容涵盖从架构设计、阿里百炼API安全配置、Milvus部署优化,到RAG检索、会话管理等核心实现,并提供了生产级API设计、监控集成及性能优化等实战经验,旨在帮助开发者打造高可用、可维护的Java AI应用。 阅读详情

相关推荐

四阶龙格库塔方法求解一次常微分方程组

四阶龙格库塔方法求解一次常微分方程组一、写在前面二、四阶龙格库塔方法三、使用四阶龙格库塔方法求解一次常微分方程组 一、写在前面 龙格库塔方法是数值求解常微分非线性方程的有利工具,计算精度较高,通过缩短步进距离和增加阶数可以进一步控制误差范围。工程上较为常用的是四阶龙格库塔算法(R-K4),在计算收敛的情况下往往可以得到比较好的结果。 二、四阶龙格库塔方法 这里简单介绍一下算法的具体实现过程,不做详细的推导。其求解的问题是形如方程: y˙=f(y,t),其中t∈[t0,t1]初值y(t0)=c0 \dot{y

HelloWorldTM的博客 2万+

C++——【USACO 5.2.1】——Snail Trails

Snail Trails All Ireland Contest Sally Snail likes to stroll on a N x N square grid (1 <n <= 120). She always starts in the upper left corner of the grid. The grid has empty squares (denoted below

McDonnell_Douglas的博客 740

matlab中高频变压器怎么找,干货|手把手教你绕制高频变压器

原标题:干货|手把手教你绕制高频变压器绕制一个变压器所需材料:磁芯、骨架、各种铜线、麦拉胶带。变压器参数:磁芯:EE22原边:134T(1-3脚),辅助:32T(5-4脚),输出:15T(10-9脚)原边电感:1380±10%uH漏感:≤44uH引脚分布图: 特别注意:绕制方法为网上下载,其中变压器绕制方法是对的,但其中存在着很多问题(比如,正规变压器的绕组的头和尾是要添加铁氟龙套管的,每一层之间...

weixin_30895121的博客 2123

C++之——实现排列组合

当涉足算法领域,排列组合应该是最基础的。最近遇到了,作个记录,小白看看,大神绕路 一、补充公式 排列的定义:从n个不同元素中,任取m(m≤n,m与n均为自然数,下同)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号 A(n,m)表示,公式如下: A(n,m) =...

Snail_cz的博客 2万+

绕过Google Play:获取Expo Go安卓APK的实用指南

本文为国内安卓开发者提供了绕过Google Play商店获取Expo Go APK的实用指南。针对无法访问Google Play的痛点,详细介绍了通过官方GitHub Releases、可信第三方网站(如APKMirror)及APK下载器等多种安全获取途径,并重点讲解了APK安装、安全验证(核对签名)及常见连接问题的排查方法,帮助开发者顺利开启React Native开发之旅。

weixin_29006701的博客 577

Qt 【window udp 高频采集丢包问题】

使用Asio + 无锁队列或者环形缓存区方案可以解决 qt udp 在window平台高速采集 (128k)丢包问题。

weixin_45397344的博客 177

三元运算符的优先级

在QT2.3.10的源代码中看到如下使用三元运算符的方法,但不知道具体的运算的顺序    const QCanvasItem* i1 = s1 ?       (const QCanvasItem*)s1 : p1 ?       (const QCanvasItem*)p1 : r1 ?       (const QCanvasItem*)r1 : e1 ?       (const QCa

飞羽飞の猪の博客 4346

【Bug已解决】[Bug]: ValueError: No user query found in messages QWEN 3.5 27B VLLM 0.16.0 NIGHTLY 解决方案

用 vLLM 0.16.0 nightly 给发聊天请求时,服务端在处理消息时抛ValueError,请求失败。

博客 403

写了个测试vector,map存取的小程序

#include #include #include using namespace std;class object{public:    object():id(objectsum++),name("object"){ cout     ~object(){cout     object(const object& o){id = o.id;name = "object_copy"; cout

飞羽飞の猪の博客 1574

国科大学习资料--遥感原理集图像处理(尤红建)--2019年期末考试

国科大学习资料–遥感原理集图像处理(尤红建)–2019年期末考试 国科大学习资料–遥感原理集图像处理(尤红建)–2019年期末考试 国科大学习资料–遥感原理集图像处理(尤红建)–2019年期末考试 ================================================================== ================================================================== ==============

无名何许人的博客 1469

AUTOSAR&UDS 理论要点及isolar实战-DEM模块

从这节开始,将讲解UDS诊断中非常重要的知识点:故障事件触发、故障信息上报、故障信息处理、故障信息存储和故障系统降级,后续会陆续更新。

cqaa11的博客 552

刚学C写的东西,纪念下:)

这个程序用来模拟从串口读出NMEA协议的数据并校检和解析~~因为刚用C,C++写代码,写的应该还蛮难看的~~#include #include #include //author:snail//070403typedef unsigned char U8;typedef signed int S32;typedef unsigned short int U16;typedef si

飞羽飞の猪の博客 1505

芒果YOLOv7改进48:主干篇:独家首发改进:目标检测新范式骨干PPHGNetv2改进版,充分融合信息特征,提升YOLOv7检测能力

YOLOv7代码改进实践 | 独家首发改进 PPHGNetv2 改进版结构

包括YOLOv5、YOLOv7、YOLOv8等模型改进 1848

[初]对于C++内存模型的一个测试小程序

#include #include using namespace std;//对于C++内存模型的一个测试小程序 //author:snail//date:2007-03-02//*class MemoryKiller{public:     MemoryKiller(){};private:    int bigMemory[1024*1024];  };//全局区(静态区

飞羽飞の猪の博客 1072

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

对象揭秘[LanJoyner]--第三章 模块与导入

        大致扫了下第3章,模块与导入。写作风格大致是LanJoyner批判C++的某些不是,然后以Java,Eiffel的在这方面的优势来比较论述的。作为程序员。从我的观点出发,这一章是写的非常客观的。我大致有2年的C++开发经验和2年的Java开发经验。而且是不断切换(而不是中间断层)这两种技术解决工作上的问题的。所以深有感触。虽然项目不大,但

飞羽飞の猪の博客 845

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

深挖C++:类和对象(中)

(先进后出)

xys_678的博客 222

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

选型笔记:Type‑C 扩展坞方案评估|DP1.4 转 HDMI2.0 桥接芯片 GSV2201S@ACP

本文记录 GSV2201S 这款 DP1.4a 转 HDMI2.0 桥接芯片评估,梳理视频、HDCP、PD 集成能力,总结 Type‑C 转接 Dongle、扩展坞方案的适配边界,以及差分走线、PD 时序、HDCP 握手等高频调试问题,为 C 口视频转接方案选型提供参考。

ACP广源盛的博客 220

C++移动构造函数详解

移动构造函数是C++11引入的一种特殊构造函数,用于从临时对象(右值)"窃取"资源来初始化新对象,而不是进行昂贵的深拷贝。char* data;public:// 移动构造函数:参数是右值引用 &&// 关键:把源对象的资源置空。

拒绝AI文,努力在AI时代写出感动人心的好文章 388

ThunderKittens 深度解析:一个不基于 MLIR 的 C++ 模板 GPU DSL

Triton 是"让更多人能写 GPU kernel",ThunderKittens 是"让会写的人写得更爽"。前者用 MLIR 换易用性,后者用 C++ 模板换可控性。它们不是替代关系,而是覆盖了 GPU 编程光谱的两端。ThunderKittens 的出现,本质上是对"GPU DSL 必须基于 MLIR"这一默认假设的挑战。编译期类型系统本身就可以是一个强大的 DSL 基础设施,不需要中间 IR,不需要黑盒 pass,也能实现 tile 级抽象和零运行时开销。

Maxwell_Newton的博客 333

【C语言】字符与字符串函数

C语言中字符串为以\0结尾的字符数组,标准库函数基于此约定。本文解析字符串内存布局,详解ctype.h与string.h中字符分类、长度计算、拷贝、比较等函数的使用要点,强调长度判断与越界风险,最后通过命令行待办事项示例整合fgets、sscanf、strncpy、strcmp,展示实际应用中的关键细节。

记录在学习过程中学到的知识 343

C++ 多态详解:作用、原理与实战用法

多态是C++面向对象的核心特性,通过虚函数实现运行期动态绑定,使同一接口在不同对象上表现出不同行为。其核心作用包括统一接口、提升可扩展性、降低耦合、支持运行时分派与批量处理。实现依赖虚函数表(vtable)和虚指针(vptr),需注意虚析构函数、对象切片等陷阱。相比编译期多态(模板),运行期多态灵活性高但有调用开销。合理结合两者,可兼顾代码的灵活性与性能,是构建可扩展、低耦合系统的关键。

2402_85743155的博客 377

C++ 函数模版

模板参数:● template ,T 就是类型占位符,名字可以自定义,习惯用T● 占位符可以在函数返回值、形参、函数内部当作类型使用使用要点模板代码一般写在头文件:编译器需要看到完整模板源码,才能在每个编译单元完成实例化全局函数、类内成员函数都可以写成模板实例化发生在编译阶段,不是运行时隐式实例化:调用时编译器自动推导实参类型,生成对应版本函数。

2501_94041724的博客 303

C++ 运行时多态与虚函数机制全面剖析【面试重点】

构成C++ 运行时多态必须是基类的指针或者引用调用虚函数。被调用的函数必须是虚函数,并且派生类必须对该虚函数完成重写/覆盖(Override)。只有基类的指针或引用才能既指向基类对象,又指向派生类对象(切片机制);而只有完成了虚函数重写,派生类与基类才具备不同的函数行为,达到“指向谁就调用谁”的效果。在类成员函数的前面加上virtual关键字修饰,该成员函数就成为了虚函数。public:// 成员函数前加 virtual 修饰,声明为虚函数。

Fuyo_0209的博客 435

#SQLite 数据库笔记一:(概念 / 终端指令 / SQL 语句 / C 编程 / 回调函数)

数据库 = 数据的仓库,假设数据是海量。能力说明存储数据持久化保存,程序退出数据还在统计数据、分组、排序数据管理增、删、改、查(CRUD)嵌入式设备上也会用数据库(单片机网关、路由器、工业 HMI 都常见),因为 sqlite 体积小、无需服务进程、单文件即可。数据库 = 库 > 表 > 记录(行) > 字段(列)sqlite3 = 开源、C 写的、单文件、免安装、最多 2T 的嵌入式关系型数据库。

lwq20051110的博客 149

【C++】【STL】string_OJ题

本文总结了9道C++ STL中关于string的OJ题目,按操作类型分为三组:反转与就地修改(如917、541、151)、计数与查找(如387、125、58)、模拟与大数运算(如415、43、8)。核心技巧包括双指针收敛、字符分类处理、进位控制及边界值处理。所有题目使用同一套源码,在标准库std::string与自定义容器MyString间切换仅需宏定义,验证结果一致性。代码通过随机测试用例与Trace函数逐行比对,确保逻辑正确性,强调接口对齐的重要性。

这里是Cocatrice的博客,感谢大家一直以来的支持和鼓励,如果对C/C++方向感兴趣的话,可以通过主页的微信名片加Cocatrice的好友,也可以通过邮箱:Chen31980094@163.com 联系,一同加油! 4370

C 语言 malloc() 详解与实战 Demo

本文详解C语言malloc()函数,涵盖其语法、内存原理及实战应用。通过动态整数、数组、结构体与链表的Demo,演示如何安全申请、使用与释放内存,强调避免内存泄漏与空指针检查的重要性,帮助开发者掌握动态内存管理核心技能。

tangPHP的博客 366
上一篇: [初]对于C++内存模型的一个测试小程序
下一篇: QT的中文化相关问题
飞羽飞之猪
博客等级 码龄21年 127粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值