当前位置: 首页 > news >正文

c++ new 和 malloc 分配内存

创建一个类

class Test {
public:Test() { std::cout << "constructor"; }virtual ~Test() {}void print() { std::cout << "a:" << a; }private:int a = 10;
};

main函数

int main(int argv, char **args)
{std::cout << "class size:" << sizeof(Test);void *ptr = ::malloc(sizeof(Test));std::cout << "new class";new (ptr) Test;std::cout << "convert";Test *test = (Test *)ptr;test->print();delete test;::free(ptr);return 0;
}

输出

class size: 16 
new class 
constructor 
convert
a: 10 
free(): double free detected in tcache 2
Aborted (core dumped)

这里例子通过malloc分配了 class Test需要的内存空间
new (ptr) Test实际上就是将ptr内存分配给了class Test
可以看到调用了new (ptr) Test后, 就调用了class Test的构造函数

通过 Test *test = (Test *)ptr
ptr转换class Test
就可以调用class Test的函数

最后可以看到当调用delete test后再调用::free(ptr)
就触发了
free(): double free detected in tcache 2
Aborted (core dumped)

所以ptrclass Test访问的都是同一块内存

这就是内存池一个大致的原理
通过预先申请一块, 每当new的时候, 就是将预先申请的内存分配给class
delete的时候, 只是程序回收了这个内存块, 不是返还给系统

再看一个例子, 将class修改一下

class Test {
public:Test(int _A) : a(_A) { std::cout << "constructor"; }virtual ~Test() { std::cout << "destructor, a: " << a; }void print() { std::cout << "a:" << a; }private:int a;
};

main函数

int main(int argv, char **args)
{std::cout << "class size:" << sizeof(Test);void *ptr = ::malloc(sizeof(Test) * 10);new (ptr) Test(10);Test *test = (Test *)ptr;test->print();new ((void *)((Test *)ptr + sizeof(Test))) Test(20);Test *test2 = ((Test *)ptr + sizeof(Test));test2->print();delete test;delete test2;::free(ptr);return 0;
}

输出

class size: 16 
constructor 
a: 10 
constructor 
a: 20 
destructor, a:  10 
destructor, a:  20 
free(): invalid pointer
Aborted (core dumped)

相关文章:

  • rk3588 linux配置YT8531H以太网灯的状态
  • 计算机是如何工作的
  • LabVIEW电路板性能与稳定性测试系统
  • thinkadmin发邮件功能如何设置?怎么使用?
  • Vue 组件之间的通信
  • 嵌入式学习——网络编程(TCP)——day31
  • 短视频矩阵系统----可视化剪辑独立开发(采用php)
  • [STM32]定位器与PWM的LED控制
  • SQL数据库性能优化
  • 【QT】QFont字体设置
  • Ubuntu为sudo指令设置免密码
  • 【FAS】《Liveness Detection on Face Anti-spoofing》
  • 【Python】实现极致:克服PyInstaller打包挑战,解决libpython3.10.so.1.0库丢失难题
  • 教师常用小程序分享
  • AlaSQL.js:用SQL解锁JavaScript数据操作的魔法
  • 03Go 类型总结
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Angularjs之国际化
  • CSS实用技巧干货
  • git 常用命令
  • in typeof instanceof ===这些运算符有什么作用
  • Java 内存分配及垃圾回收机制初探
  • Java多线程(4):使用线程池执行定时任务
  • Less 日常用法
  • MySQL的数据类型
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • spring security oauth2 password授权模式
  • SpringBoot几种定时任务的实现方式
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • Web设计流程优化:网页效果图设计新思路
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 微信公众号开发小记——5.python微信红包
  • 微信开源mars源码分析1—上层samples分析
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 一天一个设计模式之JS实现——适配器模式
  • 用mpvue开发微信小程序
  • 智能合约Solidity教程-事件和日志(一)
  • linux 淘宝开源监控工具tsar
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ‌分布式计算技术与复杂算法优化:‌现代数据处理的基石
  • #Linux(帮助手册)
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • ${ }的特别功能
  • (1)(1.11) SiK Radio v2(一)
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (转)Windows2003安全设置/维护
  • (转载)(官方)UE4--图像编程----着色器开发
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET 分布式技术比较