(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. [PAT]求集合数据的均方差(15)

    #include "stdio.h" #include "malloc.h" #include "math.h" int *getinput ...

  2. flask一些资料

    http://shulhi.com/celery-integration-with-flask/ https://jeffknupp.com/blog/2014/01/29/productionizi ...

  3. mac配置nginx

    基本的安装其实网上一大半教程:      安装:brew install nginx  配置注意要点:      1.主要配置监听的端口和php-fpm监听的端口相同可以配置成默认的:(127.0.0 ...

  4. Corba概念(GIOP、IIOP、IOR、ORB、IDL)

    CORBA公用对象请求代理(调度)程序体系结构(Common Object Request Broker Architecture),缩写为 CORBA,是对象管理组织(Object Manageme ...

  5. c#中获取数组的行列个数的方法

    GetUpperBound可以获取数组的最高下标.GetLowerBound可以获取数组的最低下标.这样就可以实现对数组的遍历//定义二维数组string[,] myStrArr2=new strin ...

  6. sql server 行转列解决方案

    主要应用case语句来解决行转列的问题 行转列问题主要分为两类 1)简单的行转列问题: 示例表: id  sid           course  result 1   2005001 语文     ...

  7. Couldn't resolve Mac Server "mymac"

    vs2015创建一个iphone app ,Couldn't resolve Mac Server “mymac” 伤.下班走人

  8. rutime中动态调用类的方法

    Dynamically invoke a class method in Objective C 代码 #import <Foundation/Foundation.h> #import ...

  9. 如何用Jquery实现 ,比如点击图片之后 ,该图片变成向下的箭头,再点击向下箭头的图片 又变成原始图片呢

    <!DOCTYPE html><html><head><meta charset="utf-8" /><title>切换 ...

  10. TCP/ip协议栈之内核调优

    大并发带来服务器各种层出不穷的问题,我们要善用服务器系统内核,因为其性能优于用户态的玩意 注:若想永久保存参数,可将其加入到/etc/sysctl.conf中,执行sysctl -p使其永久生效,临时 ...