`
bolovesang
  • 浏览: 16948 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

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

 
阅读更多

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

 

     malloc 与free 是C++/C 语言的标准库函数,new/delete 是C++的运算符.他们都可以用于申请动态内存和释放内

存。

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

     因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

     我们先看一看malloc/free 和new/delete如何实现对象的动态内存管理。

 

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();  //清除工作
	free(a);  //释放内存

}

 

void UseNewDelete(void)
{
	Obj *a = new Obj;  //申请动态内存并且初始化
	//...
	delete a;  //清楚并且释放内存
}

 

     类Obj的函数Initialize 模拟了构造函数的功能,函数Destroy 模拟了析构函数的功能。函数UseMallocFree中,由于malloc/free不能执行构造函数与析构函数,必须调用成员函数Initialize和Destroy来完成初始化与清除工作.函数UseNewDelete则简单得多。

    所以我们不要企图用malloc/free 来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言 malloc/free 和new/delete 是等价的。

    既然new/delete 的功能完全覆盖了malloc/free ,为什么C++不把malloc/free 淘汰出具呢?只是因为C++程序经常要调用C函数,而C程序只能用malloc/free 管理动态内存。

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

 

0
3
分享到:
评论

相关推荐

    malloc和new的区别

    在实际开发中,malloc/free和new/delete都可以用于动态内存管理,但是它们有着不同的应用场景和用途。malloc/free通常用于C语言和C++语言混合编程环境中,而new/delete则更适合纯C++语言开发环境。同时,new/delete...

    深入理解C++中的new/delete和malloc/free动态内存管理及区别介绍

    本篇文章将深入探讨C++中的`new/delete`和C语言中的`malloc/free`这两种动态内存管理方式,以及它们之间的区别。 首先,`malloc/free`是C/C++标准库提供的函数,用于在运行时动态分配和释放内存。`malloc(size_t ...

    Malloc和new区别

    与 Malloc 和 Free 不同,New 和 Delete 是编译器级别的特性,而非库函数。 #### 二、动态内存分配与初始化 对于 C++ 中的数据结构或对象来说,仅使用 Malloc 和 Free 无法完全满足需求。具体原因如下: 1. **...

    C++中new和malloc的区别

    在C++中,动态内存分配主要通过new和delete运算符实现,而C语言中主要使用malloc和free函数。尽管这两组工具看似执行相似的功能,但它们之间存在着本质的差异。 相同点 new和malloc都可以用来在堆上分配内存,且都...

    C++中malloc与free、new与delete的详解与应用

    C++面试经常会问到关于malloc/free和new/delete的区别,网上有不同版本的解释,这里总结下并加上个人理解和使用。 两者相同点 1.都可以申请动态堆内存。 两者不同点 1.new/delete是C++的操作符,malloc/free是C/...

    11_new&delete与malloc&free 之间的关系与区别1

    "new与delete和malloc与free之间的关系与区别" 在C++编程语言中,new和delete是C++的关键字,是一种操作符,可以被重载,而malloc和free是C语言的库函数,并且不能重载。这两对函数都是用于内存管理的,但是它们...

    C++中对使用malloc/new引起的内存泄露的检查

    在C++中,`malloc`和`new`是动态内存分配的主要方式,而`free`和`delete`则用于释放这些内存。本文将详细介绍如何检查和防止由`malloc/new`引起的内存泄漏。 **1. 重载`new`和`delete`** 为了更好地管理和跟踪内存...

    c++内存的动态申请与释放.pdf

    本文将详细介绍C++中两种常用的内存动态申请与释放的方式:`malloc/free` 和 `new/delete`。 #### 二、动态内存管理的基本概念 动态内存是指在程序运行过程中根据需要动态分配和释放的内存空间。这种内存空间不...

    C++中new与delete、malloc与free应用分析

    一般来说,在C/C++的面试时,对于new/delete和malloc/free这两对的使用和区别经常被考查到,如果这种基础的问题都答不上来,估计很难过面试了。本文即是对new/delete和malloc/free这两对的使用和区别较为简单的分析...

    malloc 与new的区别

    而C++则通过关键字new和delete来实现这一功能,它们与C语言中的malloc和free既有相似之处也有明显的区别。本文将对malloc和new的区别进行详细解读,包括它们的属性、参数、返回类型、自定义类型处理、内存区域、分配...

    百度,淘宝等公司的面试题

    这里主要讨论的是`malloc/free`和`new/delete`的区别和使用场景。 首先,`malloc/free`是C/C++标准库提供的函数,用于动态内存分配和释放。它们在C++中主要适用于原始数据类型,如整型或字符型等。`malloc`函数接受...

    c/c++ mallocfree newdelete 区别

    在C/C++编程中,内存管理是至关重要的一个环节,其中`malloc`和`free`是C语言标准库提供的函数,而`new`和`delete`是C++中的运算符,它们都用于动态内存的分配和释放。虽然两者在功能上有相似之处,但在使用和功能上...

    一个C++内存管理的总结

    C++ 内存管理 chm文档 总结 1:内存分配方式 2、常见的内存错误及其对策 3、指针与数组的对比 4、指针参数是如何传递内存的? 5、杜绝“野指针” 6、有了malloc/free为什么还要new/delete? 7、内存耗尽怎么办?

    new与malloc 的区别和用法

    在C++编程中,`new`和`malloc`都是用于动态内存分配的工具,但它们在使用和功能上有显著的区别。下面将详细阐述这些差异。 首先,`new`和`delete`是C++中的运算符,而`malloc`和`free`是C/C++标准库中的函数。`new`...

    C++动态内存分配(new/new[]和delete/delete[])详解

    C++动态内存分配(new/new[]和delete/delete[])详解 为了解决这个普通的编程问题,在运行时能创建和销毁对象是基本的要求。当然,C已提供了动态内存分配函数malloc( )和free( ),以及malloc( )的变种(realloc:改变...

    C++内存管理技术内幕

    1.1.7 有了malloc/free为什么还要new/delete? new和delete提供了类型安全和构造/析构功能。new会调用对象的构造函数,delete会调用析构函数,这对于管理类对象的生命周期至关重要。malloc/free仅分配和释放原始...

    高质量C++编程指南.PDF

    7.8 有了malloc/free为什么还要new/delete ? 7.9 内存耗尽怎么办? 7.10 malloc/free 的使用要点 7.11 new/delete 的使用要点 7.12 一些心得体会 第8章 C++函数的高级特性 8.1 函数重载的概念 8.2 成员函数的重载、...

Global site tag (gtag.js) - Google Analytics