malloc和delete
- 格式:doc
- 大小:24.50 KB
- 文档页数:1
C++的内存分配机制可以分为四个区域:堆区、栈区、全局/静态存储区和常量存储区。
1. 堆区:动态内存分配区,程序在运行时可以向该区域申请一定大小的内存,用malloc或new来申请,用free或delete来释放。
2. 栈区:存放函数的参数值和局部变量,由编译器自动分配和释放,其操作方式类似于数据结构中的栈。
3. 全局/静态存储区:全局变量和静态变量被存放在此区域中,包括初始化的全局变量和静态变量(空白初始化的全局变量和静态变量也会被存放在此区域),全局变量和静态变量在程序整个运行期间一直被保留。
4. 常量存储区:常量被存放在此区域中,不允许修改。
C++内存分配机制遵循二八定律,即80%的内存空间被80%的程序所使用,而剩下的20%的内存空间则被浪费。
因此,在编写C++程序时,应该尽可能地利用好内存空间,避免内存空间的浪费。
cc++动态申请数组new和delete运算符⽤于动态分配和撤销内存的运算符new使⽤⽅法:1. 开辟单变量地址空间1)new int; //开辟⼀个存放数组的存储空间,返回⼀个指向该存储空间的地址.int *a = new int 即为将⼀个int类型的地址赋值给整型指针a.2)int *a = new int(5) 作⽤同上,可是同⼀时候将整数赋值为52. 开辟数组空间⼀维: int *a = new int[100];开辟⼀个⼤⼩为100的整型数组空间⼆维: int **a = new int[5][6]三维及其以上:依此类推.⼀般使⽤⽅法: new 类型 [初值]delete使⽤⽅法:1. int *a = new int;delete a; //释放单个int的空间2.int *a = new int[5];delete [] a; //释放int数组空间要訪问new所开辟的结构体空间,⽆法直接通过变量名进⾏,仅仅能通过赋值的指针进⾏訪问.⽤new和delete能够动态开辟,撤销地址空间.在编程序时,若⽤完⼀个变量(通常是临时存储的数组),下次须要再⽤,但却⼜想省去⼜⼀次初始化的功夫,能够在每次開始使⽤时开辟⼀个空间,在⽤完后撤销它.#include <iostream>using namespace std;int main(){char *p=new char[10];scanf ("%s",p);printf ("%s",p);delete []p;while (1);return 0;}这是⼆维数组的申请⽅法#define ROW 100#define COL 200#define T char (int,float,....) //通⽤数据类型T ** pTemp ;*pTemp = new T[ROW] ;for (int i = 0 ; i < COL ; i ++)pTemp[i] = new T[COL};/////////////////deletefor (int i =0 ; i < COL ; i ++)delete [] pTemp[i] ;delete [][]pTemp ;1.分配内存空间函数malloc 调⽤形式: (类型说明符*) malloc (size) 功能:在内存的动态存储区中分配⼀块长度为"size" 字节的连续区域。
new与malloc1.malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。
它们都可用于申请动态内存和释放内存2.对于非内部数据类型的对象(由enum,union,class、struct等关键字修饰的变量, 基本数据类型如int,char,double等都是内部数据类型,)而言,光用maloc/free无法满足动态对象的要求。
对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。
由malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
3.因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。
注意new/delete不是库函数。
4.C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
5.new可以认为是malloc加构造函数的执行。
new出来的指针是直接带类型信息的。
而malloc 返回的都是void*指针。
new delete在实现上其实调用了malloc,free函数6.new建立的对象你可以把它当成一个普通的对象,用成员函数访问,不要直接访问它的地址空间;malloc分配的是一块内存区域,就用指针访问好了,而且还可以在里面移动指针.7.new 建立的是一个对象;malloc分配的是一块内存.相同点:都可用于申请动态内存和释放内存联系;既然new/delete的功能完全覆盖了malloc /free,为什么C++还保留malloc/free 呢?因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。
如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。
c语言中new和delete的用法C语言中new和delete的用法C语言是一门底层的编程语言,不像其他高级语言一样内建有new 和delete的关键字,而是需要使用malloc和free函数来在堆内存中分配和释放内存。
然而,为了提高代码的可读性和可维护性,我们可以自定义一些函数来模拟new和delete的功能。
本文将介绍C语言中使用new和delete的几种常见用法。
使用malloc函数模拟new为了模拟C++中的new操作符,在C语言中可以定义一个名为new的函数,该函数使用malloc函数分配指定大小的内存,并返回相应的指针。
void* new(size_t size) {void* ptr = malloc(size);return ptr;}上述代码中,new函数接受一个size参数,该参数表示要分配的内存大小。
函数内部使用malloc函数分配内存,并将其返回。
使用free函数模拟delete与new函数类似,我们也可以定义一个名为delete的函数来模拟C++中的delete操作符。
void delete(void* ptr) {free(ptr);}上述代码中,delete函数接受一个指针ptr,该指针指向要释放的内存。
函数内部使用free函数释放指定的内存。
示例下面是一个使用new和delete的示例,演示如何动态分配和释放内存。
#include <>int main() {int* ptr = (int*)new(sizeof(int));*ptr = 10;printf("Value: %d\n", *ptr);delete(ptr);return 0;}上述代码首先使用new函数动态分配一个int类型的内存,并将其赋值为10。
然后,使用printf函数输出该内存的值。
最后,使用delete函数释放该内存。
总结通过定义自定义的new和delete函数,我们可以在C语言中模拟C++中的new和delete操作符的功能。
C++经典知识点⾯试题1、指针的优点和缺点优点:灵活⾼效(1)提⾼程序的编译效率和执⾏速度(数组下标往下移时,需要使⽤乘法和加法,⽽指针直接使⽤++即可)(2)通过指针可使⽤主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯。
(3)可以实现动态的存储分配。
(4)便于表⽰各种数据结构,如结构体,编写⾼质量的程序。
缺点:容易出错(1)可能变成野指针,导致程序崩溃(2)内存泄露(3)可读性差2、指针和引⽤的定义和区别(1)指针和引⽤的定义1)指针:指针是⼀个变量,存储⼀个地址,指向内存的⼀个存储单元;2)引⽤跟原来的变量实质上是同⼀个东西,只不过是原变量的⼀个别名⽽已。
(2)指针和引⽤的区别<1> 从内存分配上来说:1)指针是⼀个实体,⽽引⽤仅是个别名,即为指针分配内存,⽽不为引⽤分配内存空间;<2> 从指向的内容来说:2)引⽤只能在定义时被初始化⼀次,之后不可变;指针可变;3)引⽤不能为空,指针可以为空;4)const与指针搭配可以表⽰指针指向和指针指向内容是否可变。
const与引⽤搭配只有⼀种,即来修饰其内容的可读性。
由于引⽤从⼀⽽终,不⽤修饰其指向。
5)指针可以有多级,但是引⽤只能是⼀级(int **p;合法,⽽int &&a是不合法的)<3> 其他⽅⾯6)"sizeof引⽤"得到的是所指向的变量(对象)的⼤⼩,⽽"sizeof指针"得到的是指针本⾝的⼤⼩;7)指针和引⽤的⾃增(++)运算意义不⼀样;指针和引⽤在符号表中的形式:程序在编译时分别将指针和引⽤添加到符号表上。
在符号表上记录的是变量名及变量所对应地址。
在符号表上,指针变量对应的地址值为指针变量的地址值,⽽引⽤对应的地址值是引⽤对象的地址值。
符号表⽣成后就不会再改,因此指针可以改变指向的对象(指针变量中的值可以改),⽽引⽤对象不能改。
c++——对象的动态建⽴和释放(new和delete)3.8 对象的动态建⽴和释放1 new和delete基本语法1)在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插⼊与删除。
在C语⾔中是利⽤库函数malloc和free 来分配和撤销内存空间的。
C++提供了较简便⽽功能较强的运算符new和delete来取代malloc和free函数。
注意: new和delete是运算符,不是函数,因此执⾏效率⾼。
2)虽然为了与C语⾔兼容,C++仍保留malloc和free函数,但建议⽤户不⽤malloc和free函数,⽽⽤new和delete运算符。
new运算符的例⼦:new int; //开辟⼀个存放整数的存储空间,返回⼀个指向该存储空间的地址(即指针)new int(100); //开辟⼀个存放整数的空间,并指定该整数的初值为100,返回⼀个指向该存储空间的地址new char[10]; //开辟⼀个存放字符数组(包括10个元素)的空间,返回⾸元素的地址new int[5][4]; //开辟⼀个存放⼆维整型数组(⼤⼩为5*4)的空间,返回⾸元素的地址float *p=new float (3.14159); //开辟⼀个存放单精度数的空间,并指定该实数的初值为//3.14159,将返回的该空间的地址赋给指针变量p3)new和delete运算符使⽤的⼀般格式为:⽤new分配数组空间时不能指定初值。
如果由于内存不⾜等原因⽽⽆法正常分配空间,则new会返回⼀个空指针NULL,⽤户可以根据该指针的值判断分配空间是否成功。
1)应⽤举例2 类对象的动态建⽴和释放使⽤类名定义的对象都是静态的,在程序运⾏过程中,对象所占的空间是不能随时释放的。
但有时⼈们希望在需要⽤到对象时才建⽴对象,在不需要⽤该对象时就撤销它,释放它所占的内存空间以供别的数据使⽤。
这样可提⾼内存空间的利⽤率。
C++中,可以⽤new运算符动态建⽴对象,⽤delete运算符撤销对象⽐如:Box *pt; //定义⼀个指向Box类对象的指针变量ptpt=new Box; //在pt中存放了新建对象的起始地址在程序中就可以通过pt访问这个新建的对象。
堆分配存储的方法
堆分配存储的方法是指在程序运行期间动态地分配和释放内存空间的方法。
常见的堆分配存储的方法有以下几种:
1. malloc和free:malloc是动态分配内存的函数,用于在堆上
分配一块指定大小的内存空间。
free函数用于释放先前malloc
分配的内存空间。
这种方法是C语言中常用的堆分配存储的
方法。
2. new和delete:new是C++中的关键字,用于在堆上分配一
块指定大小的内存空间,并调用构造函数进行初始化。
delete
关键字用于释放new分配的内存空间,并调用析构函数进行
清理工作。
这种方法是C++中常用的堆分配存储的方法。
3. calloc和realloc:calloc是一个动态分配内存的函数,用于
在堆上分配一块指定大小的内存空间,并初始化为0。
realloc
函数用于重新分配先前动态分配的内存空间的大小。
这种方法常用于C语言中。
4. new[]和delete[]:new[]是new的数组形式,用于在堆上分
配连续的一组指定大小的内存空间,并调用构造函数进行初始化。
delete[]则用于释放new[]分配的内存空间,并调用析构函
数进行清理工作。
这种方法常用于C++中对数组的堆分配存储。
注意:使用堆分配存储的方法需要手动管理内存的分配和释放,
需要确保正确地释放已使用的内存,避免内存泄漏和野指针等问题。
C++程序员面试宝典(1)1.new、delete、malloc、free关系(1)delete会调用对象的析构函数,new调用构造函数。
Malloc申请内存空间,free只会释放内存。
(2)malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。
(3)它们都可用于申请动态内存和释放内存。
对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。
(4)对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。
由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。
注意new/delete不是库函数。
(5)都是在堆(heap)上进行动态的内存操作。
用malloc函数需要指定内存分配的字节数并且不能初始化对象,new 会自动调用对象的构造函数。
delete 会调用对象的destructor,而free 不会调用对象的destructor.2.delete与delete []区别delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数。
delete与New配套,delete []与new []配套MemT est*mTest1=newMemTest[10];MemT est*mTest2=newMemTest;int*pInt1=newint[10];int*pInt2=newint;delete[]pInt1; //-1-delete[]pInt2; //-2-报错,要使用deletedelete[]mTest1;//-3-delete[]mTest2;//-4-报错,使用delete这就说明:对于内建简单数据类型,delete和delete[]功能是相同的。
1.const 符号常量;(1)const char *p(2)char const *p(3)char * const p说明上面三种描述的区别;如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。
2请讲一讲析构函数和虚函数的用法和作用?答:析构函数的作用是当对象生命期结束时释放对象所占用的资源。
析构函数用法:析构函数是特殊的类成员函数它的名字和类名相同,没有返回值,没有参数不能随意调用也没有重载。
只是在类对象生命期结束时有系统自动调用。
虚函数用在继承中,当在派生类中需要重新定义基类的函数时需要在基类中将该函数声明为虚函数,作用为使程序支持动态联遍。
3解释堆和栈的区别栈(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。
其操作方式类似于数据结构中的栈。
堆:一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。
注意它与数据结构中的堆是两回事,分配方式倒是类似于链表.4. 头文件的作用是什么?答:一、通过头文件来调用库功能。
在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。
用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。
编译器会从库中提取相应的代码。
二、头文件能加强类型安全检查。
如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。
5. 内存的分配方式的分配方式有几种?答:一、从静态存储区域分配。
内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。
例如全局变量。
二、在栈上创建。
在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。
栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
详解C++中new运算符和delete运算符的使⽤C++ ⽀持使⽤ new 和 delete 运算符动态分配和释放对象。
这些运算符为来⾃称为“⾃由存储”的池中的对象分配内存。
new 运算符调⽤特殊函数 operator new,delete 运算符调⽤特殊函数 operator delete。
在 Visual C++ .NET 2002 中,标准 C++ 库中的 new 功能将⽀持 C++ 标准中指定的⾏为,如果内存分配失败,则会引发std::bad_alloc 异常。
如果内存分配失败,C 运⾏库的 new 函数也将引发 std::bad_alloc 异常。
如果您仍需要 C 运⾏库的 new 的⾮引发版本,请将您的程序链接到 nothrownew.obj。
但是,当您链接到 nothrownew.obj 时,标准 C++ 库中的 new 将不再起作⽤。
调⽤ new 运算符在程序中遇到以下语句时,它将转换为对函数 operator new 的调⽤:char *pch = new char[BUFFER_SIZE];如果请求针对零字节存储,operator new 将返回⼀个指向不同的对象的指针(即对 operator new 的重复调⽤将返回不同的指针)。
如果分配请求没有⾜够的内存,则 operator new 将返回 NULL 或引发异常(有关详细信息,请参阅)。
可以编写尝试释放内存的例程并重试分配;有关详细信息,请参阅 _set_new_handler。
有关恢复⽅案的更多详细信息,请参阅以下主题:处理内存不⾜的情况。
下表中描述了 operator new 函数的两个范围。
operator new 函数的范围运算符范围::operator new全局class-name ::operator new类operator new 的第⼀个参数的类型必须为 size_t(STDDEF.H 中定义的类型),并且返回类型始终为 void *。
由于malloc/free是库函数,不是运算符,他们不能执行构造函数和析构函数,只是负责分配内存。
1、malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。
它们都可用于申请动态内存和释放内存。
2、对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。
对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。
由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
3、因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。
注意new/delete不是库函数。
4、C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存
new 是个操作符,和什么”+”,”-”,”=”…有一样的地位.malloc是个
分配内存的函数,供你调用的.
new是保留字,不需要头文件支持.malloc需要头文件库函数支持.
new 建立的是一个对象,malloc分配的是一块内存.
new建立的对象你可以把它当成一个普通的对象,用成员函数访问,不要直
接访问它的地址空间。
malloc分配的是一块内存区域,就用指针访问好了,而且还可以在里面移动指针。