有了malloc/free为什么还要new/delete?

news/2024/6/29 11:49:53 标签: initialization, delete, 工作, 编译器, 语言, c
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="htmledit_views">

来自: color: #9a9a9a;">http://hi.baidu.com/sppeivan/blog/item/3041ca0e7c3d39206059f3ba.html

malloc与free是C++/Cclass="tags" href="/tags/YuYan.html" title=语言>语言的标准库函数࿰c;new/class="tags" href="/tags/DELETE.html" title=delete>delete是C++的运算符。它们都可用于申请动态内存和释放内存。

  对于非内部数据类型的对象而言࿰c;光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数࿰c;对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符࿰c;不在class="tags" href="/tags/BianYiQi.html" title=编译器>编译器控制权限之内࿰c;不能够把执行构造函数和析构函数的任务强加于malloc/free。

   因此C++class="tags" href="/tags/YuYan.html" title=语言>语言需要一个能完成动态内存分配和初始化class="tags" href="/tags/GongZuo.html" title=工作>工作的运算符new࿰c;以及一个能完成清理与释放内存class="tags" href="/tags/GongZuo.html" title=工作>工作的运算符class="tags" href="/tags/DELETE.html" title=delete>delete。注意new/class="tags" href="/tags/DELETE.html" title=delete>delete不是库函数。我们先看一看malloc/free和new/class="tags" href="/tags/DELETE.html" title=delete>delete如何实现对象的动态内存管理࿰c;见示例6。

class Obj
{
 public :
  Obj(void){ cout << “Initialization” << endl; }
  ~Obj(void){ cout << “Destroy” << endl; }
  void Initialize(void){ cout << “Initialization” << endl; }
  void Destroy(void){ cout << “Destroy” << endl; }
};
void UseMallocFree(void)
{
 Obj *a = (obj *)malloc(sizeof(obj)); // 申请动态内存
 a->Initialize(); // 初始化
 //…
 a->Destroy(); // 清除class="tags" href="/tags/GongZuo.html" title=工作>工作
 free(a); // 释放内存
}
void UseNewDelete(void)
{
 Obj *a = new Obj; // 申请动态内存并且初始化
 //…
 class="tags" href="/tags/DELETE.html" title=delete>delete a; // 清除并且释放内存
}     

示例6 用malloc/free和new/class="tags" href="/tags/DELETE.html" title=delete>delete如何实现对象的动态内存管理

  类Obj的函数Initialize模拟了构造函数的功能࿰c;函数Destroy模拟了析构函数的功能。函数UseMallocFree中࿰c;由于malloc/free不能执行构造函数与析构函数࿰c;必须调用成员函数Initialize和Destroy来完成初始化与清除class="tags" href="/tags/GongZuo.html" title=工作>工作。函数UseNewDelete则简单得多。

  所以我们不要企图用malloc/free来完成动态对象的内存管理࿰c;应该用new/class="tags" href="/tags/DELETE.html" title=delete>delete。由于内部数据类型的“对象”没有构造与析构的过程࿰c;对它们而言malloc/free和new/class="tags" href="/tags/DELETE.html" title=delete>delete是等价的。

  既然new/class="tags" href="/tags/DELETE.html" title=delete>delete的功能完全覆盖了malloc/free࿰c;为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数࿰c;而C程序只能用malloc/free管理动态内存。

  如果用free释放“new创建的动态对象”࿰c;那么该对象因无法执行析构函数而可能导致程序出错。如果用class="tags" href="/tags/DELETE.html" title=delete>delete释放“malloc申请的动态内存”࿰c;理论上讲程序不会出错࿰c;但是该程序的可读性很差。所以new/class="tags" href="/tags/DELETE.html" title=delete>delete必须配对使用࿰c;malloc/free也一样。

      color: #ff0000;">总之࿰c;malloc/free和new/class="tags" href="/tags/DELETE.html" title=delete>delete不能交叉配对使用。

cle>

http://www.niftyadmin.cn/n/1187007.html

相关文章

Find out with my performance review of the nike pg 1

The Nike PG 1 makes Paul George the fourth Nike Basketball signature athlete to receive his own sneaker. It features a forefoot Zoom Air unit, a full-length Phylon foam midsole, and it’s priced at $110. Is that enough to get the PG 1 into your gym bag? F…

林 锐《大学十年 —— 一个程序员的历程》值得成功和欲成功的朋友品读(转载)(上)

林 锐《大学十年》【作者介绍】 linrui  林锐&#xff0c;2000年获浙江大学计算机应用博士学位。大学期间两度被评为中国百名跨世纪优秀大学生&#xff0c;199/6年获电子工业部科技进步二等奖&#xff0c;1997年获首届中国大学生电脑大赛软件展示一等奖。2000年7月加入上海贝…

利用统计进行中文分词与词性分析

今天&#xff0c;翻出了我以前在本科阶段写的一些论文&#xff0c;虽然有几篇没有发表。突然发现很多还是比较实用&#xff0c;虽然学术价值并不是很大&#xff0c;于是我重新整理了下&#xff0c;用最简单的方式&#xff0c;摘要了部分出来拼成此文&#xff0c;当然拼的原料都…

【转】MVC之 自定义过滤器(ActionFilterAttribute)

原文地址&#xff1a;https://www.cnblogs.com/hnsongbiao/p/8717553.html阅读目录一、自定义Filter二、带参数的自定义Filter三、全局过滤器 回到目录一、自定义Filter 自定义Filter需要继承ActionFilterAttribute抽象类&#xff0c;重写其中需要的方法&#xff0c;来看下Act…

林 锐《大学十年 —— 一个程序员的历程》值得成功和欲成功的朋友品读(转载)(下)

1997年11月&#xff0c;在穷得快挨饿的时候&#xff0c;我获得了中国大学生跨世纪发展基金特等奖&#xff08;全国共20名&#xff0c;奖金1万元&#xff09;&#xff0c;到人民大会堂领奖。给我们出钱的是一个靠资本运作发财的集团&#xff0c;在宴会前&#xff0c;该集团领导人…

byte 和 octet有什么区别?

最近项目中写文档&#xff0c;由于跟老外合作&#xff0c;所有都是英文的。经常遇到octet这个词&#xff0c;我只是知道byte是一个由8 bits构成的字节&#xff0c;那么octet是什么呢&#xff1f;原来&#xff0c;不同计算机中字节的长度不同&#xff0c;为了不引起歧义&#xf…

OpenCV2:初中篇 图像平滑技术-图像噪声

一.简介 图像噪声是图像在获取或传输过程中受到随机信号干扰而出现的. 常见的衡量信号噪声大小的方法是计算信噪比 二.椒盐噪声 三.高斯噪声 四.空间平滑 转载于:https://www.cnblogs.com/k5bg/p/11195875.html

unsigned char与char的区别

http://blog.csdn.net/zjl_1026_2001/article/details/3209158 char 是有符号的 unsigned char 是无符号的,里面全是正数 两者都作为字符用的话是没有区别的&#xff0c;但当整数用时有区别&#xff1a; char 整数范围为-128到127&#xff0c; 而unsigned char 整数范围为0…