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

new/delete malloc/free深入剖析

malloc和free是C语言用来分配和回收堆内存的函数,而new和delete是C++语言的引进的关键字。

-- malloc函数

void *malloc( size_t size );

该函数需要传入一个参数,该参数指明要分配多少个字节的内存;返回一个void类型的指针。

示例用法:int* a = (int*)malloc(4*sizeof(int));

-- free函数

void free( void *memblock );

该函数需要传入待回收堆内存的首地址。

关于C语言的内存分配和释放,比较简单,没什么需要特别注意的地方。

----------------------------------------------------------------------------

以下重点讨论new/delete的一些要注意的细节,new [] / delete[]类似。

+++ 3种类型的new/delete +++

(1)new operator/delete operator

      为语言内建的操作符,不能被程序员改变其行为。

对于基本类型而言,new只会为其分配相应的内存;delete只会将分配的内存进行回收。

但对于复合类型,new除了分配内存之外,还会调用该对象的构造函数来对对象进行初始化;delete除了回收内存,还会在此之前,调用该对象的析构函数来对对象执行清理工作。

(2)operator new/operator delete

      通过编写operator new/operator delete函数,程序员可以自定义分配和释放内存时所执行的操作。

      尽量不用这种类型的new和delete,对于复合类型往往会带来一些问题。

      注意:这种自定义的new和delete是不会调用构造函数和析构函数的,这点与malloc和free比较相像。

opeartor new的函数通常声明如下:

void* operator new(size_t size);

调用方式为:

std::string* pStr = ::operator new(sizeof(std::string));

------

opeartor delete的函数通常声明如下:

void operator delete(void* pMem);

调用方式为:

::operator delete(pStr);


new [] / delete []

void * operator new[] (size_t size);
void   operator delete[] (void* pMem);


(3)placement new

       有时可能会有一些分配好的原始内存,我们需要在上面构建对象。placement new可以用来达到此目的。placement new是c++标准程序库的一部分,要使用placement new,必须#include <new>。placement new在已有的内存地址上构建对象,并会调用构造函数。

具体用法:

class widget
{
public:
    widget(int n);
};

widget* constructWidgetInBuf(void* buf, int n)
{
    return new (buf) widget(n);
}

 

*** new的异常处理 ***

如果new了很大的一块空间,最好是进行异常判断。

try{
    int* pMem = new int[100000];
}
catch(std::bad_alloc& e)
{
    std::cout << e.what() << std::endl;
}

  

以上需要#include <new>。

 

  

相关文章:

  • Linux下使用locale命令设置语言环境
  • EOS的综合除尘系统
  • 树状数组 POJ 2481 Cows
  • 匿名内部类
  • HDU1664 BFS + 数论 + 剪枝
  • HP VA7400存储故障诊断,数据恢复有可能
  • 对创业的反思-自我定位
  • UITableView 基本使用方法总结
  • PHPExcel 长数字串显示为科学计数
  • .Mobi域名介绍
  • QueryDb
  • vmware、操作系统、数据库软件、oracle 补丁地址
  • 乾坤合一~Linux设备驱动之I2C核心、总线以及设备驱动
  • C#学习笔记七索引器
  • sprint计划会议
  • (三)从jvm层面了解线程的启动和停止
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【附node操作实例】redis简明入门系列—字符串类型
  • canvas 五子棋游戏
  • Consul Config 使用Git做版本控制的实现
  • ERLANG 网工修炼笔记 ---- UDP
  • Git同步原始仓库到Fork仓库中
  • iOS 颜色设置看我就够了
  • js 实现textarea输入字数提示
  • Python_OOP
  • socket.io+express实现聊天室的思考(三)
  • SpringBoot 实战 (三) | 配置文件详解
  • supervisor 永不挂掉的进程 安装以及使用
  • Vim Clutch | 面向脚踏板编程……
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 十年未变!安全,谁之责?(下)
  • 微信小程序--------语音识别(前端自己也能玩)
  • 微信支付JSAPI,实测!终极方案
  • 在weex里面使用chart图表
  • Linux权限管理(week1_day5)--技术流ken
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 进程与线程(三)——进程/线程间通信
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (3)STL算法之搜索
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (js)循环条件满足时终止循环
  • (独孤九剑)--文件系统
  • (附源码)php投票系统 毕业设计 121500
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (理论篇)httpmoudle和httphandler一览
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • .Family_物联网
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET Core引入性能分析引导优化
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件