(1)内存管理函数与内存管理运算符的区别

内存管理函数有内存分配函数,malloc calloc realloc 以及内存释放函数free。

内存管理运算符有new 和delete.

两种内存管理方式的最大区别就是malloc以及free等内存管理函数是库函数,不在编译器的控制 范围之内。并且在创建对象实例时,malloc只是负责内存的分配,并没有对分配的内存调用构造函数以及初始化。malloc分配的内存时void类型的内存,需要做相应的内存转换。

而内存管理运算符(new delete)完成了两个动作,第一 就是为对象分配内存,第二  为分配的对象内存调用构造函数初始化。

 #include"D:\programmer practice\thinking in c++\require.h"
#include<cstdlib>
#include<cstring>
#include<iostream> using namespace std; class Obj{
int i, j, k;
enum{sz=};
char buf[sz];
public:
Obj(){
cout << "Obj()" << endl;
}
~Obj(){
cout << "~Obj()" << endl;
}
void initialize(){
cout << "initialize()" << endl;
i = j = k = ;
memset(buf,,sz);
} void destory()const{
cout << "destory()" << endl;
} }; int main(){
Obj* objPtr = (Obj*)malloc(sizeof(Obj));//malloc只是分配了一块内存,而不是生成一个对象
//所以malloc返回的是一个void* 类型的指针。我们知道c++是强类型语言
//它不允许将一个void*类型指针赋予任何其他类型的指针,所以要做类型转换
require(objPtr!=); objPtr->initialize();//malloc只负责分配内存,不负责初始化,所以并没有调用类的构造函数。所以需要我们自己手动初始化对象。 objPtr->destory();//也不会调用构造含糊的析构函数,同样销毁对象也需要我们自己手动进行。
free(objPtr);
}

上面的运行结果,在我们用malloc为Obj类的对象分配内存时,并没有调用构造函数,在程序结束后也没有调用析构函数。就是因为malloc只是分配内存。

下面我们把main 函数内的代码修改一下

 int main(){
Obj* objPtr = new Obj;
delete objPtr;
return ;
}

上面的运行结果就会发现,在用new运算符创建对象时,就对分配的对象内存进行了初始化(调用构造函数)。

总结如下:

new 运算符在创建对象时,第一步是为对象分配内存,第二步是为分配的对象内存调用构造函数。

delete运算符在销毁对象时,第一步是调用析构函数,第二步是把对象内存释放。

malloc是库函数,不是运算符,所以只是分配内存。

内存管理运算符new delete与内存管理函数malloc free的区别——已经他们对对象创建的过程。的更多相关文章

  1. Java对象创建的过程及对象的内存布局与访问定位

    这里以HotSpot为例,且所说的对象指普通的Java对象,不包括数组和Class对象等. 1.对象创建的过程 1.类加载.解析.初始化:虚拟机遇到new时先检查此指令的参数是否能在常量池中找到类的符 ...

  2. 内存分配(new/delete,malloc/free,allocator,内存池)

    以下来源http://www.cnblogs.com/JCSU/articles/1051826.html 程序员们经常编写内存管理程序,往往提心吊胆.如果不想触雷,唯一的解决办法就是发现所有潜伏的地 ...

  3. C/C++语言的标准库函数malloc/free与运算符new/delete的区别

    概括地说 1.malloc与free是C++/C的标准库函数,new/delete是C++的运算符,它们都可用于申请动态内存和释放内存. 2.对于非内部数据类型的对象而言,只用malloc/free无 ...

  4. new/delete 和malloc/free 的区别

    new/delete 和malloc/free 的区别 一.基本概念malloc/free:1.函数原型及说明:      void *malloc(long NumBytes):该函数分配了NumB ...

  5. C++ Primer : 第十二章 : 动态内存之动态内存管理(new和delete)

    C++语言定义了两个运算符来分配和释放动态内存:运算符new分配内存,运算符delete释放new分配的内存. 运算符new和delete 使用new动态分配和初始化对象 在自由空间分配的内存是无名的 ...

  6. 动态内存管理---new&amp;delete

    动态内存管理 动态对象(堆对象)是程序在执行过程中在动态内存中用new运算符创建的对象. 因为是用户自己用new运算符创建的.因此也要求用户自己用delete运算符释放,即用户必须自己管理动态内存. ...

  7. 深入理解C++ new/delete, new []/delete[]动态内存管理

    在C语言中,我们写程序时,总是会有动态开辟内存的需求,每到这个时候我们就会想到用malloc/free 去从堆里面动态申请出来一段内存给我们用.但对这一块申请出来的内存,往往还需要我们对它进行稍许的“ ...

  8. 2-Python基础语法-内存管理-运算符-程序控制

    目录 1 Python 基础语法 1.1 注释 1.2 缩进 1.3 续行 1.4 标识符 1.5 转义序列 1.6 数字 1.7 字符串 1.8 其他 2 Python 运算符 2.1 赋值运算符 ...

  9. C++内存管理:new / delete 和 cookie

    new 和 delete C++的内存申请和释放是通过 new 和 delete 实现的, 而new 和 delete 其实就是通过 malloc 和 free 实现的. new 申请内存分为三个步骤 ...

随机推荐

  1. PASCAL==CALLBACK==WINAPI==__stdcall

    VC里面:PASCAL==CALLBACK==WINAPI==__stdcall         _stdcall是Pascal程序的缺省调用方式,通常用于Win32  Api中,函数采用从右到左的压 ...

  2. JDBC进行批处理

    转自 http://mousepc.iteye.com/blog/1131462 业务场景:当需要向数据库发送一批SQL语句执行时,应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升 ...

  3. 实习日记:图像检索算法 LSH 的总结与分析

    先贴上这两天刚出炉的C++代码.(利用 STL 偷了不少功夫,代码待优化) Head.h #ifndef HEAD_H #define HEAD_H #include "D:\\LiYang ...

  4. Ajax+json实现菜单动态级联

    1:jsp //级联ajax处理函数 function areaChange(){    var areano=document.all("areaNo").value;    v ...

  5. 神奇的C语言

    当然下面列出来的几点都是C的基础用法,只不过是这些用法可能平时不会被注意.所以很多东西第一次看到的时候,可能会觉得很怪异,但是细细想想就能很好的理解,也就能更好的清楚C语言的一些特性.但是在具体的编码 ...

  6. TFS 2010 如何删除Collection

    在cmd  中 cd 到 目录 c:\Program Files\Microsoft Team Foundation Sever 2010\Tools 执行下面的命令: TfsConfig colle ...

  7. 智能指针 ADO数据库连接

    ADO库包含三个基本接口:_ConnectionPtr接口._CommandPtr接口和_RecordsetPtr接口._ConnectionPtr接口返回一个记录集或一个空指针.通常使用它来创建一个 ...

  8. JS实现转动效果

    方案一 <div class="div_uploading"> <div class="div_uploading_scroll">&l ...

  9. 【转】提高VR渲染速度的最好方法(经典转载)

    VR的基本渲染方法掌握起来并不难,但是最迫切需要解决的问题是VR的出图速度问题.动则需要数小时的渲染时间真的是很难以接受,我们从三个影响速度的参数结合网上一些高手的教程来分析一下. 一.Irradia ...

  10. APP分发渠道的竞争分析

    一. 最近几年,手机APP市场发展非常迅速,随着手机的硬件水平的不断升级,大量资本涌入,越来越多的开发者从桌面平台开发转移到移动平台开发,面对数以万计的手机APP,如何推广自己的APP成了难题,APP ...