new与delete,malloc与free
1.new_delete与malloc_free
❶malloc/free:
malloc原型: void *malloc(long NumBytes)
该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。申请了内存空间后,必须检查是否分配成功。
free原型:void free(void *FirstByte):
该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。
❷二者区别在于
⑴ malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符
⑵ new能够自动分配空间大小,malloc需要计算大小作为传入参数。但是,2者都是从堆中获得内存。
⑶ new/delete能进行对对象进行构造和析构函数的调用进而对内存进行更加详细的工作,而malloc/free不能。实际上,malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。而new 内置了sizeof、类型转换和类型安全检查功能。对于非内部数据类型的对象而言,new 在创建动态对象的同时完成了初始化工作。
⑷内存分配失败,处理机制不同。
ⅰmalloc分配失败时,返回NULL。因此必须要人工检查是否分配成功
ⅱ new分配失败时,抛出std::bad_alloc异常。可以在new的入口点采用了nothrow对象避免跑出而返回0:
class widget { ... };
widget *pw1=new widget;//分配失败抛出std::bad_alloc
if(pw1== 0) ... // 这个检查一定失败
widget* pw2= new (nothrow) widget;//若分配失败返回0
if(pw2==0) ... //这个检查可能会成功
❸new和malloc的用法:
int *p = (int *) malloc(sizeof(int) * length); Obj *objects = new Obj[100](1);// 创建100 个动态对象的同时赋初值1
string *ps=new string(10,’9’);//*ps 为“9999999999”
int *pi=new int(100); //指针pi所指向的对象初始化为100
2.realloc重新分配内存机制
extern void *realloc(void *mem_address, unsigned int newsize)//注意newsize并非是需要增加相对的大小,而是总的大小
原理:
先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。
如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。也需要人工检查是否分配失败。
例如:
对于一个2*4的数组,要扩容至为3*5的数组。
#include<iostream>
using namespace std; //数组显示
void show(int p[],int n){
for(int i=0;i<n;i++)
cout<<p[i]<<" ";
cout<<endl;
}
void main(){ //初始大小2*4
int** p=new int*[2];
p[0]=new int[4];
p[1]=new int[4];
for(int i=0;i<4;i++){
p[0][i]=i;
p[1][i]=i+4;
}
show(p[0],4);show(p[1],4); //重新分配,扩容至3*5
p=(int**)realloc(p,3*sizeof(int*));
p[0]=(int*)realloc(p[0],5*sizeof(int));
p[1]=(int*)realloc(p[1],5*sizeof(int));
p[2]=(int*)malloc(5*sizeof(int)); //数组赋值
if(!p&&!p[0]&&!p[1]&&!p[2]){
p[0][4]=8;
p[1][4]=9; for(int i=0;i<5;i++)
p[2][i]=i+10;
} show(p[0],5);show(p[1],5);show(p[2],5); for(int i=0;i<3;i++)
delete[]p[i];
delete []p;
}
参考:
new与delete,malloc与free的更多相关文章
- 深入C++ new/delete,malloc/free解析
深入C++ new/delete,malloc/free解析 1.malloc与free是C++/C语言的标准库函数.new/delete是C++的运算符. 它们都可用于申请动态内存和释放内存 2.对 ...
- C++ new delete malloc free
title: C++ new delete malloc free date: 2020-03-10 categories: c++ tags: 语法 C++的new delete malloc fr ...
- new和delete malloc和free
程序中动态分配的对象存放在自由存储区(free store)或堆(heap). C语言程序使用一对标准库函数malloc和free在自由存储区中分配存储空间,而C++语言则使用new和delete表达 ...
- new,delete,malloc,free
malloc/free是C语言中的内存申请和释放函数,利用它们可方便地管理内存.而在C++中我们又有了新的工具:new/delete.new/delete在管理内存的同时会调用类的构造函数和析构函数, ...
- 内存分配方式,堆区,栈区,new/delete/malloc/free
1.内存分配方式 内存分配方式有三种: [1]从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. [2]在栈上创建.在执行函数时 ...
- C++之new/delete/malloc/free详解
主要内容: 1. C语言中的函数malloc和free 2. C++中的运算符new和delete 3. new/delete与malloc/free之间的联系和区别 4. C/C++程序的内 ...
- C++/C语言的标准库函数与运算符的区别new/delete malloc/free
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存.下面来看他们的区别. 一.操作对象有所不同 malloc与free是C++ ...
- 内存分配(new/delete,malloc/free,allocator,内存池)
以下来源http://www.cnblogs.com/JCSU/articles/1051826.html 程序员们经常编写内存管理程序,往往提心吊胆.如果不想触雷,唯一的解决办法就是发现所有潜伏的地 ...
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free
内存分配方式 内存分配方式有三种: [1] 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量, static 变量. [2] 在栈上创建.在执行函 ...
- 动态内存的分配(new delete malloc free)
new和malloc的区别是什么?-new关键字是C++的一部分,在所有的C++编译器中都被支持-malloc是由C库提供的函数,在某些系统开发中是不能调用的-new以具体类型为单位进行内存分配-ma ...
随机推荐
- poj 1836 LIS变形
题目链接http://poj.org/problem?id=1836 Alignment Time Limit: 1000MS Memory Limit: 30000K Total Submiss ...
- MYSQL 索引创建与使用
可能用到索引的地方: where 子句,order by,group by 不需要创建索引的情况: 1. 表比较小 2.赋值有限的列(枚举),不要创建索引.创建的索引返回的行越少越好,此时区分度大. ...
- DQN 处理 CartPole 问题——使用强化学习,本质上是训练MLP,预测每一个动作的得分
代码: # -*- coding: utf-8 -*- import random import gym import numpy as np from collections import dequ ...
- 如何下载中文语言包让Eclipse汉化?
Eclipse软件是JAVA开发必备的软件,对于英语不好的人而言面对英文代码还好,但是软件也是英语的那就头疼了,怎么解决?可以去官网下载中文语言包解压到Eclipse安装目录就可以汉化了. 工具/ ...
- js操作获取和设置cookie
//创建cookie function setCookie(name, value, expires, path, domain, secure) { var cookieText = encodeU ...
- 第三次ScrumMeeting
每个人的工作(有Issue的内容和链接):昨天已完成的工作,今天计划完成的工作:工作中遇到的困难. --by 张华杰 团队成员 昨日完成任务 明日要完成的任务 易子沐 搭建主页框架 issue14 前 ...
- LeetCode OJ:Construct Binary Tree from Inorder and Postorder Traversal(从中序以及后序遍历结果中构造二叉树)
Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...
- Effective C++ 条款10
令operator=返回一个reference to *this 将operator=返回一个reference是为了什么呢?答案很简单,就是为了实现连锁形式. 什么是连锁形式,如int x,y,z: ...
- 获得客户端ip
获得客户端ip private function GetIP(){ if(!empty($_SERVER["HTTP_CLIENT_IP"])){ ...
- 总结的一些MySQL数据库面试题
1.sql语句应该考虑哪些安全性? 1.防止sql注入,对特殊字符进行转义,过滤或者使用预编译的sql语句绑定变量. 2.最小权限原则,特别是不要用root账户,为不同的类型的动作或者组建使用不同的账 ...