C++用new创建对象和不用new创建对象的区别解析

我们都知道C++中有三种创建对象的方法,如下:


复制代码 代码如下:

#include <iostream>
using namespace std;

class A
{
private:
    int n;
public:
    A(int m):n(m)
    {
    }
    ~A(){}
};

int main()
{
    A a(1);  //栈中分配
    A b = A(1);  //栈中分配
    A* c = new A(1);  //堆中分配
  delete c;
    return 0;
}

第一种和第二种没什么区别,一个隐式调用,一个显式调用,两者都是在进程虚拟地址空间中的栈中分配内存,而第三种使用了new,在堆中分配了内存,而栈中内存的分配和释放是由系统管理,而堆中内存的分配和释放必须由程序员手动释放,所以这就产生一个问题是把对象放在栈中还是放在堆中的问题,这个问题又和堆和栈本身的区别有关:

这里面有几个问题:
1.堆和栈最大可分配的内存的大小
2.堆和栈的内存管理方式
3.堆和栈的分配效率

首先针对第一个问题,一般来说对于一个进程栈的大小远远小于堆的大小,在linux中,你可以使用ulimit -s (单位kb)来查看一个进程栈的最大可分配大小,一般来说不超过8M,有的甚至不超过2M,不过这个可以设置,而对于堆你会发现,针对一个进程堆的最大可分配的大小在G的数量级上,不同系统可能不一样,比如32位系统最大不超过2G,而64为系统最大不超过4G,所以当你需要一个分配的大小的内存时,请用new,即用堆。

其次针对第二个问题,栈是系统数据结构,对于进程/线程是唯一的,它的分配与释放由操作系统来维护,不需要开发者来管理。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时,这些存储单元会被自动释放。栈内存分配运算内置于处理器的指令集中,效率很高,不同的操作系统对栈都有一定的限制。 堆上的内存分配,亦称动态内存分配。程序在运行的期间用malloc申请的内存,这部分内存由程序员自己负责管理,其生存期由开发者决定:在何时分配,分配多少,并在何时用free来释放该内存。这是唯一可以由开发者参与管理的内存。使用的好坏直接决定系统的性能和稳定。

由上可知,但我们需要的内存很少,你又能确定你到底需要多少内存时,请用栈。而当你需要在运行时才知道你到底需要多少内存时,请用堆。

最后针对第三个问题,栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率 比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在 堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会 分 到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。

由上可知,能用栈则用栈。


复制代码 代码如下:

#include <stdio.h>
#include <stdlib.h> 
void main()
{
 int n,*p,i,j,m;
 printf("本程序可对任意个整数排序;\n");
 printf("请输入整数的总个数: ");
 scanf("%d",&n);
 p=(int *)calloc(n,sizeof(int));    //运行时决定内存分配大小
 if(p==0)   {
  printf("分配失败!\n"); 
  exit(1); 
 }

时间: 2013-07-25

js中创建对象的几种方式示例介绍

JavaScript中的所有事物都是对象:字符串.数组.数值.函数等.JS中并没有类的概念, 但我们可以利用JS的语法特征,以类的思想来创建对象. 原始方法 复制代码 代码如下: <script type="text/javascript"> var obj = new Object(); obj.name = "Koji"; //为对象添加属性 obj.age = 21; obj.showName = function(){ //为对象添加方法 ale

JavaScript 三种创建对象的方法

JavaScript中对象的创建有以下几种方式: (1)使用内置对象 (2)使用JSON符号 (3)自定义对象构造 一.使用内置对象 JavaScript可用的内置对象可分为两种: 1,JavaScript语言原生对象(语言级对象),如String.Object.Function等: 2,JavaScript运行期的宿主对象(环境宿主级对象),如window.document.body等. 我们所说的使用内置对象,是指通过JavaScript语言原生对象的构造方法,实例化出一个新的对象.如: 复

收集的比较全的automation服务器不能创建对象 异常原因和解决方法第1/2页

1.automation服务器不能创建对象 只需要运行:regsvr32 scrrun.dll 就可以了 2.未将对象引用设置到对象的实例. 1.ViewState 对象为Unll. 2.DateSet 空. 3.sql语句或Datebase的原因导致DataReader空. 4.声明字符串变量时未赋空值就应用变量. 5.未用new初始化对象. 6.Session对象为空. 7.对控件赋文本值时,值不存在 8.使用Request.QueryString()时,所获取的对象不存在,或在值为空时未赋

JavaScript创建对象的七种方式全面总结

JavaScript创建对象的方式有很多,通过Object构造函数或对象字面量的方式也可以创建单个对象,显然这两种方式会产生大量的重复代码,并不适合量产.接下来介绍七种非常经典的创建对象的方式,他们也各有优缺点 工厂模式 function createPerson(name, job) { var o = new Object() o.name = name o.job = job o.sayName = function() { console.log(this.name) } return

JavaScript 创建对象

第一种:JSON方式/对象直接量 格式: var 对象名 = { 变量1: 变量1的值, 变量1: 变量1的值, --, 函数1: function() { 函数体 }, 函数2: function() { 函数体 }//Note:最后的逗号要去除为了和IE兼容. }; 说明: (1) 大括号内直接填写变量或者函数: (2) 对象的内容与值以冒号分隔,成对出现: (3) 包含的变量或者函数之间以逗号分隔: (4) 函数需要写在function(){}的大括号之内. 例子: var 对象名 = {

js创建对象的几种常用方式小结(推荐)

第一种模式:工厂方式 复制代码 代码如下: var lev=function(){ return "我们"; }; function Parent(){ var Child = new Object(); Child.name="脚本"; Child.age="4"; Child.lev=lev; return Child; }; var x = Parent(); alert(x.name); alert(x.lev()); 说明: 1.在函数

使用隐藏的new来创建对象

很多时候我们是这样写类,然后使用new创建对象的. 复制代码 代码如下: function Person(name,age){ this.name=name; this.age=age; } Person.prototype={ setName : function(n){this.name=n;}, getName : function(){return this.name;} } var p = new Person('jack',25); 改成这样的 复制代码 代码如下: function

JS 创建对象(常见的几种方法)

贴个代码先: function O(user,pwd){ //use constructor this.user=user; this.pwd=pwd; this.get=get; return this; } function O2(user,pwd){ //use factory var obj=new Object(); obj.user=user; obj.pwd=pwd; obj.get=get; return obj; } function O3(){ //use prototype

&quot;automation服务器不能创建对象”的问题的解决方案总结大全

本人工作中的应用系统都是jsp的,大量javascript程序,一旦出"automation服务器不能创建对象"问题,大量报表及查询无法保存,苦思冥 想.千尝万试,终于将其搞定,现将相关方案与大家共享.  1.如果是Scripting.FileSystemObject (FSO 文本文件读写)被关闭了,开启FSO功能即可,在"运行"中执行regsvr32 scrrun.dll即可 2.安全模式设置成"中",如果javascript脚本中报这个错误

automation服务器不能创建对象 解决方法

昨天开机打开Visual Studio.Net,准备新建一个项目,却发生一件奇怪的事情,系统报告"automation服务器不能创建对象"错误.然后在解决方案中只见项目名,而不见项目文件了.真是奇怪.再尝试打开已有项目,却一切正常.windows应用程序,控制台,或是Web应用程序,都无法建立. 而上周关机之前我还做了项目,不是好好的吗?百思不得其解.无奈之下,只是恢复安装.net.熬过漫长的等待,装好后打开,满以为问题解决了.结果仍然让我郁闷.横下心,干脆彻底卸载.net,然后重装.

Automation服务器不能创建对象的多种解决办法

方法一: 开始-运行:regsvr32 scrrun.dll 方法二: 请将以下语句复制到记事本中,另存为后缀为.cmd的文件,并运行.当然在命令行下一句句运行也没问题. echo 正在修复,这个过程可能需要几分钟,请稍候-- rundll32.exe advpack.dll /DelNodeRunDLL32 %systemroot%\System32\dacui.dll rundll32.exe advpack.dll /DelNodeRunDLL32 %systemroot%\Catroot

Asp.net调试的一些问题小结

昨天到今天搞了一整天,把人都要差点搞崩了! ,以后再也不能乱关机了,因为这次的大意,几乎所有的Net安装,调试问题都被我碰到了,还好,我一个个把他记录下来了,同时,在CSDN找了一些相关的解决方法,不敢独享,供大家相互学习交流之用. 起因是这样的,机子运行IE时假死,我用着不爽,就二话不说热启动,结果就出事了. 重新打开正在Vs2003.Net里面正在作的项目时,老半天没反应,机子变得异常慢,当然,出于职业的敏感,马上来了个Ctrl+Alt+Del,这下不好,CPU占用100%,一直高居不下,运

vs.Net2003无法打开或创建Web应用程序若干解决办法.

昨天到今天搞了一整天,把人都要差点搞崩了! ,以后再也不能乱关机了,因为这次的大意,几乎所有的Net安装,调试问题都被我碰到了,还好,我一个个把他记录下来了,同时,在CSDN找了一些相关的解决方法,不敢独享,供大家相互学习交流之用. 起因是这样的,机子运行IE时假死,我用着不爽,就二话不说热启动,结果就出事了. 重新打开正在Vs2003.Net里面正在作的项目时,老半天没反应,机子变得异常慢,当然,出于职业的敏感,马上来了个Ctrl+Alt+Del,这下不好,CPU占用100%,一直高居不下,运

IIS6下配置fastcgi的php的教程

FastCGI的IIS模块可以让流行的应用框架在IIS上支持FastCGI协议以提供高性能和可用性的访问服务,FastCGI面向现有的网络服务器提供高性能的CGI替代标准.具体PHP 安装方法我记录下来,其中包括出现的一个错误.环境: 操作系统:Windows 2003 Server PHP版本:PHP5.25 1.下载FastCGI For IIS6 http://www.microsoft.com/downloads/details.aspx?FamilyID=2d481579-9a7c-4

JavaScript使用FileSystemObject对象写入文本文件内容的方法

本文实例讲述了JavaScript使用FileSystemObject对象写入文本文件内容的方法.分享给大家供大家参考.具体如下: 这段代码主要是练习JavaScript的FileSystemObject对象,用它来让JavaScript向一个文本文件中写入内容,这个TXT文件的路径你可以自己指定,然后定义好要写入的内容,运行代码,你会发现原来的TXT文本中的内容已改变. 运行效果如下图所示: 具体代码如下: <html> <head> <title>写入文本文件<

JS判断浏览器是否安装flash插件的简单方法

1. 直接判断是否有flash插件 var myFlash = (function(){ if(typeof window.ActiveXObject != "undefined"){ return new ActiveXObject("ShockwaveFlash.ShockwaveFlash"); }else{ return navigator.plugins['Shockwave Flash']; } })(); chrome: Edge浏览器中取消了wind

JavaScript实现删除,移动和复制文件的方法

本文实例讲述了JavaScript实现删除,移动和复制文件的方法.分享给大家供大家参考.具体如下: 这里利用JavaScript删除.移动和复制文件,运行前请确保文件已经存在,比如在C盘建立test.txt文件,然后在代码里修改为这个路径,再运行代码,就可以看到效果. <html> <head> <title>删除,移动和复制文件</title> </head> <body> <h2>删除,移动和复制文件</h2&g