new 、delete和malloc、free的解析及区别

在c语言中使用函数malloc和free来进行内存管理(分配与释放),在c++中则提供了运算符new和delete来做同样的工作,后者比前者性能更优越,使用更方便更灵活。

1.new用于内存分配的基本形式为:

指针变量名=new 类型

在程序运行过程中new是从堆的一块自由存储区中为程序分配一块与类型字节数相适应的内存空间,并将该块内存的首地址存于指针变量中。

eg.

int *p;   //声明一个整形指针变量p

p=new int;   //动态分配一个存放int型数据的内存空间,并将首地址赋给p

delete  指针变量名

delete p;

运算符new和delete功能类似于函数malloc()和free();但是他们有以下几个优点:

(1)运算符new可以自动计算所要分配内存类型的大小,而不必使用函数sizeof()来计算所需要的字节数,这就减少了发生错误的可能性。

(2)运算符new能够自动返回正确的指针类型,不必对返回指针进行强制类型转换。

在此要注意:

(1)用运算符new分配的空间,使用结束后应该只能用运算符delete显示地释放,否则这部分空间将不能回收而变成死空间,如果这样一直new下去,系统可能会造成瘫痪。

(2)用运算符new动态分配内存时,如果没有足够的内存满足分配要求,new将返回空指针(NULL),故通常要对内存的动态分配是否成功进行检查。

(3)若用free释放new创建的动态对象,那么该对象因无法执行析构而导致程序出错。用delete释放malloc申请的动态内存,理论上是不会出错的,但该程序的可读性很差。


eg.

int main()

{

int *p;

p=new int;

if(!p)

{

cout<<"allocation failure";

return 1;

}

*p=10;

cout<<*p;

delete p;

return 0;

}

如果使用运算符new为数组动态分配内存时,这时要在类型名后面加上数组大小。

例如:

int *p=new int[10];

如果是为多维数组分配空间时:

例如:

int *pi=new int[2][3][4];

用delete删除时,无需指出所删除的维数和大小。只需在指针前面加一个方括号,表示对数组空间的操作。

eg. delete []pi;

new delete和malloc free的区别:

1.new delete 是c++中的操作符,而malloc free为c中的一个函数。

2.new 不止分配内存而且会调用类的构造函数,delete会调用析构函数,malloc只分配内存不会进行初始化类成员工作,free不会调用析构函数。

3.new出来的指针是直接带类型信息的,而malloc返回的都是void指针。

时间: 2024-08-27 00:42:45

new 、delete和malloc、free的解析及区别的相关文章

[转]浅谈new/delete和malloc/free的用法与区别

目录 一.new和delete用法 二.malloc和free的用法 三.new和malloc的区别 正文 每个程序在执行时都会占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为自由存储区或堆. 回到顶部 一.new和delete用法 如下几行代码: int *pi=new int; int *pi=new int(); int *pi=new int(1024); 第一行这个new表达式在自由存储区中分配创建了一个整形对象,并返回一个指向该对象的地址来初始化指针pi.第二行同一行,

浅谈c++ new、delete与malloc和free

malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存.对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求.对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数.由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free.因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释

new/delete 与 malloc/free的区别

一.概述 在C++中,申请动态内存与释放动态内存用new/delete 与 malloc/free都可以,而且他们的存储方式相同,new/malloc申请的动态内存位于堆中,无法被操作系统自动回收,需要对应的delete也free释放空间. malloc/free是C/C++语言的标准库函数,在C语言中需要头文件#include<stdlib.h>的支持.而new/delete是C++的运算符.对于类对象而言,malloc/free无法满足动态对象的要求,对象要求在创建的同时自动执行构造函数,

关于new,delete,malloc,free的一些总结

首先,new,delete都是c++的关键字并不是函数,通过特定的语法组成表达式,new可以在编译的时候确定其返回值.可以直接使用string *p=new string("asdfgh");来直接赋值.这其中在调用new分配空间得时候的时候,系统其实直接调用了类或结构的构造函数来对对其进行赋值,这个过程就相当于是string p=string("asdfgh"); 或者string p("asdfgh");(其实上面的过程还是有一定的不同之处:

new/delete 和 malloc/free有什么区别和联系

区别: 1. new/delete是C++的操作符,malloc/free是C/C++标准库函数. 2. new分为两步的:第一步是申请内存,第二步则是调用构造函数初始化对象.同样,在调用delete的时候,需要先调用析构函数,然后再回收堆内存.malloc只会根据参数分配内存,默认返回指向void*的指针,同样free释放malloc分配的内存. 3.malloc/free是new/delete的一个子集. 共同点: 1. 都必须配对使用,这里的配对使用,可不能理解为一个new/malloc就

new/delete 和 malloc/free 的区别

1.malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存.但是new能够自动分配空间大小,而malloc需要计算字节数. 2.对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求.对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数.由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free. 因此C++语言

C++之new、delete 与malloc、free的异同

在C/C++编程中经常会申请内存,而对内存的申请释放操作有两套方法: new.delete 与malloc.free.他们的使用最好是成对使用,不要去混搭---这可不是时尚界哦.如下是这两组方法的异同或区别: 1.new.delete是c++中的操作符,malloc.free是C中的一个函数,它们都可用于申请动态内存和释放内存. 2.new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而malloc则只分配内存,不会进行初始化类成员的工作,同样free也不会调用析

new/delete 和malloc/free 的区别一般汇总

一.基本概念 malloc/free: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败,则返回一个空指针(NULL). void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由. 2.内存操作: malloc函数的参数是接受需要分配的内存字节数,如果内存能够满足请求量,那么将会返回:指向被分

new/delete与malloc/free的区别

参考: https://blog.csdn.net/u013485792/article/details/51329541 https://www.cnblogs.com/lyl-312/p/5528892.html http://www.cnblogs.com/QG-whz/p/5140930.html https://blog.csdn.net/gukesdo/article/details/7506155 本文在写作中参考了上述文章,特此感谢! [导语] 之前对new和delete,mal