使用具有权威说服力的实例辨明C++中的malloc与new

使用具有权威说服力的实例辨明C++中的malloc与new

问题:

很多人都知道malloc与new都是用来申请空间用的,开辟空间来源于堆中。但是在C++中却很少用malloc去申请空间,为什么?

下面小编会以一个很有说服力的例子来说明,相信大家一看就能明白。

C++程序的格局可分为4个区,注意是“格局”,

1、全局数据区     //其中全局变量,静态变量是属于全局数据区

2、代码区     //所有的类和非成员函数的代码都存放在代码区

3、栈区    //为成员函数运行而分配的局部变量的空间都在栈区

4、堆区 //剩下的那些空间都属于堆区

其中全局变量,静态变量是属于全局数据区;所有的类和非成员函数的代码都存放在代码区;为成员函数运行而分配的局部变量的空间都在栈区,剩下的那些空间都属于堆区。

下面来写个简单的例子:malloc.cpp

#include <iostream>
using namespace std;
#include <stdlib.h>

class Test{
    public:
        Test(){
            cout<<"The Class have Constructed"<<endl;
        }
        ~Test(){
            cout<<"The Class have DisConstructed"<<endl;
        }
};

int main(){
    Test *p = (Test*)malloc(sizeof(Test));
    free(p);
    //delete p;
    return 0;
}

编译运行:The Class have DisConstructed

结果是没有调用构造函数,从这个例子可以看出,调用malloc后,malloc只负责给对象指针分配空间,而不去调用构造函数对其初始化。而C++中一个类的对象构造,需要是分配空间,调用构造函数,成员的初始化,或者说对象的一个初始化过程。通过上述例子希望大家在使用C++中尽量不要去使用malloc,而去使用new。

<span style="font-size:14px;">#include <iostream>
using namespace std;
#include <stdlib.h>

class Test{
    public:
        Test(){
            cout<<"The Class have Constructed"<<endl;
        }
        ~Test(){
            cout<<"The Class have DisConstructed"<<endl;
        }
};

int main(){
  //Test *p = (Test*)malloc(sizeof(Test));
    Test *p = new Test;
    cout<<"test"<<endl;

    //free(p);
    delete p;

    return 0;
}</span>

运行结果如下:

The Class have Constructed

The Class have DisConstructed

如果想更加系统了解C++ new/delete,malloc/free的异同点,可以参看“深入C++
new/delete,malloc/free解析
”了解详情。

时间: 2024-10-10 01:17:24

使用具有权威说服力的实例辨明C++中的malloc与new的相关文章

【SIGGRAPH】用【有说服力的照片真实】技术实现最终幻想15的视觉特效

原文:西川善司 http://www.4gamer.net/games/075/G007535/20160726064/ 最终幻想15的演讲会场.相当大,听众非常多. 在本次计算机图形和交互技术大会[SIGGRAPH 2016]上,和游戏相关的CG技术解说方面上,SQUARE ENIX有很强的存在感.这个计划于2016年9月发售的[最终幻想15]的制作相关的会议,很多人都预订参加了.对于外海也有很高关注度的FFXV,有可以了解开发内幕的机会,多数的游戏开发者当然不会错过的. 这次报道的是,最终幻

JavaScript权威指南第13章 web浏览器中的javascript

13.1 客户端javascript window对象是所有的客户端javascript特性和api的主要接入点.表示浏览器的一个窗口,可以通过window对象来引用它. window 的方法 alert() prompt() confirm() 13.2 在html里嵌入javascript 4种方法: 内联:放置在<script></script>标签之中 外部引入:<script src="   "></script> html程序

实例讲解Linux系统中硬链接与软链接的创建

导读 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接.硬链接与软链接的区别从根本上要从Inode节点说起,下面就以实例讲解Linux系统中硬链接与软链接的创建,来实际看看Linux中两种链接方式的不同. 首先要弄清楚,在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号.文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存在,从而实现

实例详解 EJB 中的六大事务传播属性--转

前言 事务 (Transaction) 是访问并可能更新数据库中各种数据项的一个程序执行单元 (unit).在关系数据库中,一个事务可以是一条或一组 SQL 语句,甚至整个程序.它有通常被称为 ACID 的原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持续性(Durability)四大特性: 原子性(Atomicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做. 一致性(Consistency):事务必须是使数据库

bootstrap历练实例: 导航元素中禁用的链接

对每个 .nav class,如果添加了 .disabled class,则会创建一个灰色的链接,同时禁用了该链接的 :hover 状态, <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>bootstrap历练实例: 导航元素中禁用的链接</ti

每天一个JavaScript实例-从js脚本中访问object元素中的SVG

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>每天一个JavaScript实例-从js脚本中访问object元素中的SVG</title> <style> </style> </head> &l

有return的情况下try catch finally的执行顺序(最有说服力的总结)

结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的:4.finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值.举例:情况1:try{}

如何制作一个有说服力的营销网站

对于企业和商家来说,网站最大的一个作用就是可以用来宣传展示以及是营销产品,从而为经营带来收益,对于这样的网站,网络上也开始给了它一个专业的说法--营销型网站,正如它的字面所说,营销型网站为的就是营销,帮助企业商家到达盈利的目的.营销型网站在制作上比普通展示类网站更为的严格,在用户的体验方面也是有所要求的. 除了页面制作的特殊要求以及是用户体验之外,营销型网站的营销和推广也是尤为重要的,这一步就要考虑到在网站建设时,网站优化的问题,如果营销型网站在制作过程中不符合网站优化的规则,那网站制作完成后,

辨明你所从事的软件的类型

知识储备:软件开发模式:瀑布,迭代,螺旋,敏捷 1.瀑布模型 优点: 方便项目管理的运作,是最典型的可预见性的方法,严格遵循预先计划的需求分析,设计,编码,集成,测试,维护的步骤顺序进行. 步骤成果作为衡量进度的方法,例如需求规格,设计文档,测试计划和代码审阅等. 缺点: 限制了开发期间团队之间的交互,自由度降低,项目早期即做出承诺导致对后期需求的变化难以调整,成本高,瀑布式方法在需求不明的并且在项目进行过程中可能变化的情况下基本是不可行的. 2.迭代式开发也被称作迭代增量式开发或迭代进化式开发