(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. youtube不显示其他人头像

    我用的是ss , 右键ss选择pac->编辑本地pac 把ggpht.com加入pac列表即可

  2. bootstrap-面板、modal

    面板: <!-- panel 面板 panel-heading 面板头部 panel-title 面板标题样式 panel-body 面板内容 --> <div class=&quo ...

  3. js--使用构造器函数来新建对象及操作

    通过new操作符来调用函数,来达到访问对象this值得目的,构造器将其创建的对象返回给我们. 直接上代码 //创建构造器函数 function Gadget(name, color){ this.na ...

  4. JS生成雪花

    <script type="text/javascript"> (function(){ function snow(left,height,src){ var div ...

  5. ssh通道技术

    所有机器均为Linux操作系统.   机器是A,中间服务器为B,目标服务器是C. 从A可以ssh到B,从B可以ssh到C,但是A不能直接ssh到C. 现在展示利用ssh通道技术从A直接传输文件到C. ...

  6. SQL Server添加MDW性能监控报表(转载)

    10.2 Data Collector与MDW Data Collection功能是SQL SERVER 2005版本提供的数据库监控报表的功能,通过定时地对数据库的语句运行情况,服务器各种资源的监控 ...

  7. delegate事件绑定

    为了代码的健壮性,绑定事件之前先解绑再进行绑定. var _$div = $("#id");_$div.undelegate("click mouseover mouse ...

  8. underscore 笔记

    //reduce是汇总 递归 var perDesc=[ {name: "haha", "email": "haha@email.com"} ...

  9. {Reship}{Matting}Image Matting

    ======================================== http://www.alphamatting.com/index.html ==================== ...

  10. flex 导出Excel功能实现

    方法一: 1.Excel导出主要代码: try   {    var bytes: ByteArray = new ByteArray();    bytes.writeMultiByte(DataG ...