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

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

一、new和delete

new和delete是C++的运算符,用于动态分配内存和释放内存。

1.new表达式

标准库定义了operator new函数的几个重载版本,没有使用noexcept说明的版本在内存分配失败时可能会抛出bad_alloc异常,而使用了的不会抛出异常。

void* operator new ( size_t );
void* operator new[]( size_t );
void* operator new ( size_t , const nothrow_t& ) noexcept;
void* operator new[]( size_t , const nothrow_t& ) noexcept;

当我们使用new表达式时,实际执行了三步操作:

①.new表达式调用上面的operator new(或者operator new[])的标准库函数,函数分配一块足够大的、原始的、未命名的内存空间以便存储特定类型的对象(或者对象的数组)。
②.编译器运行相应的构造函数以构造这些对象,并为其传入初始值。
③.对象被分配了空间并构造完成,返回一个指向该对象的指针。

对于operator new函数或者operator new[]函数来说,它的返回类型必须是void*,第一个形参的类型必须是size_t且该形参不能含有默认实参。当编译器调用operator new或者operator new[]函数时,会把存储指定对象或者指定对象的数组所需的字节数传给size_t形参。

2.delete表达式

标准库也定义了operator delete函数的几个重载版本,noexcept说明符表示在内存分配失败时返回空指针而不是抛出bad_alloc异常。

void operator delete ( void* ) noexcept;
void operator delete[]( void* ) noexcept;
void operator delete ( void* , const nothrow_t& ) noexcept;
void operator delete[]( void* , const nothrow_t& ) noexcept;

当我们使用delete表达式时,实际执行了两步操作:

①.对指针所指的对象或者所指的数组中的元素执行对应的析构函数。
②.编译器调用operator delete(或者operator delete[])的标准库函数释放内存空间。

对于operator delete函数或者operator delete[]函数来说,它们的返回类型必须是void,第一个形参的类型必须是void*。执行一条delete表达式将调用相应的operator函数,并用指向待释放内存的指针来初始化void*形参。

二、malloc和free

malloc和free是C/C++中的标准库函数,也是用于申请动态内存和释放内存。

void* malloc( size_t size );
void free( void* ptr ); 

malloc函数接受一个表示待分配字节数的size_t,返回指向分配空间的指针;如果分配失败,则返回空指针。free函数接受一个void*,它是malloc返回的指针的副本,free将相关内存返还给系统。注意:malloc函数并不会调用构造函数来初始化内存,free函数也不会自动调用析构函数。

三、new和malloc、delete和free的区别

int *p1 = new int;   // 没有初始化列表, 所以没有初始化
int *p2 = new int();  // 空初始化列表, 执行zero初始化, 所以初始化为0
int *p3 = new int(3); // 非空初始化列表, 执行值初始化, 所以初始化为3
// 注:对于没有构造函数的内置类型,new会不会初始化在于有没有初始列表(空列表“()”也算)
int *p4 = new int[100];   // 分配大小为sizeof(int)*100; 

int *p5 = (int*)malloc(sizeof(int)*128);
double *p6 = (double*)malloc(sizeof(double)*12); 

new和malloc的区别:

①.new是一个运算符,malloc()是一个库函数。

②.new会调用构造函数,而malloc()不会。

③.new返回指定类型的指针,而malloc()返回void*。

④.new会自动计算需要分配的空间,而malloc()需要手工计算字节数。

⑤.new可以被重载,而malloc()不能。

delete p1;
delete [] p2;
free(p3);
free(p4);

delete和free的区别:

①.delete是一个运算符,free()是一个库函数。

②.delete会调用析构函数,而free()不会。

③.delete可以被重载,而free()不能。

总结:

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
, delete
, new
, malloc
free
c语言 malloc free、new free delete、malloc delete、malloc free、c malloc free,以便于您获取更多的相关知识。

时间: 2024-10-21 12:38:50

C++中new与delete、malloc与free应用分析_C 语言的相关文章

探讨C++中数组名与指针的用法比较分析_C 语言

指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用.但是数组名有些地方又不同于指针.这里将数组名与指针用法的不同做一下总结(有些资料来自互联网),不妥之处,还望指正!(本文程序在WIN32平台下编译):1.数组名和指向那个数组的指针,地址相同,但大小不同用例子来说明: 复制代码 代码如下: #include "stdafx.h"#include <iostream>using namespace std;int _tmain(int

C++中引用(&amp;amp;)的用法与应用实例分析_C 语言

对于习惯使用C进行开发的朋友们,在看到c++中出现的&符号,可能会犯迷糊,因为在C语言中这个符号表示了取地址符,但是在C++中它却有着不同的用途,掌握C++的&符号,是提高代码执行效率和增强代码质量的一个很好的办法. 引用是C++引入的新语言特性,是C++常用的一个重要内容之一,正确.灵活地使用引用,可以使程序简洁.高效.我在工作中发现,许多人使用它仅仅是想当然,在某些微妙的场合,很容易出错,究其原由,大多因为没有搞清本源.故在本篇中我将对引用进行详细讨论,希望对大家更好地理解和使用引用起

new和malloc的区别深入解析_C 语言

1. malloc()函数1.1 malloc的全称是memory allocation,中文叫动态内存分配.原型:extern void *malloc(unsigned int num_bytes); 说明:分配长度为num_bytes字节的内存块.如果分配成功则返回指向被分配内存的指针,分配失败返回空指针NULL.当内存不再使用时,应使用free()函数将内存块释放. 1.2 void *malloc(int size); 说明:malloc 向系统申请分配指定size个字节的内存空间,返

浅谈C语言编程中程序的一些基本的编写优化技巧_C 语言

大概所有学习C语言的初学者,都被前辈说过,C语言是世界上接近最速的编程语言,当然这并不是吹牛,也并不是贬低其他语言,诚然非C语言能写出高速度的代码,但是C语言更容易写出高速的程序(高速不代表高效),然而再好的工具,在外行人手中也只能是黯淡没落. 对于现代编译器,现代CPU而言,我们要尽量迎合CPU的设计(比如架构和处理指令的方式等),虽然编译器是为程序员服务,并且在尽它最大的能力来优化程序员写出的代码,但是毕竟它还没有脱离电子的范畴,如果我们的代码不能让编译器理解,编译器无法帮我们优化代码,那么

详解C++编程中多级派生时的构造函数和访问属性_C 语言

C++多层派生时的构造函数 一个类不仅可以派生出一个派生类,派生类还可以继续派生,形成派生的层次结构.在上面叙述的基础上,不难写出在多级派生情况下派生类的构造函数. 通过例下面的程序,读者可以了解在多级派生情况下怎样定义派生类的构造函数.相信大家完全可以自己看懂这个程序. [例] 多级派生情况下派生类的构造函数. #include <iostream> #include<string> using namespace std; class Student//声明基类 { publi

C/C++中static,const,inline三种关键字详细总结_C 语言

一.关于staticstatic 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static 修饰符的产生原因.作用谈起,全面分析static 修饰符的实质. static 的两大作用: 一.控制存储方式 static被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间. 引出原因:函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保

C语言中多维数组的内存分配和释放(malloc与free)的方法_C 语言

如果要给二维数组(m*n)分配空间,代码可以写成下面: 复制代码 代码如下: char **a, i; // 先分配m个指针单元,注意是指针单元 // 所以每个单元的大小是sizeof(char *) a = (char **) malloc(m * sizeof(char * )); // 再分配n个字符单元, // 上面的m个指针单元指向这n个字符单元首地址 for(i = 0; i < m; i++) a[i] = (char * )malloc(n * sizeof(char )); 释

探讨:程序在内存中的分配(常量,局部变量,全局变量,程序代码)问题_C 语言

一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域.- 程序结束释放4.另外还有一个专门放常量的地方.- 程序结束释放 在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上.在所有函数体外定义的是

VC++中进程与多进程管理的方法详解_C 语言

本文实例讲述了VC++中进程与多进程管理的方法,分享给大家供大家参考.具体方法分析如下: 摘要: 本文主要介绍了多任务管理中的多进程管理技术,对进程的互斥运行.子进程的创建与结束等作了较详细的阐述. 关键词: VC++6.0:进程:环境变量:子进程 进程 进程是当前操作系统下一个被加载到内存的.正在运行的应用程序的实例.每一个进程都是由内核对象和地址空间所组成的,内核对象可以让系统在其内存放有关进程的统计信息并使系统能够以此来管理进程,而地址空间则包括了所有程序模块的代码和数据以及线程堆栈.堆分