VC程序分配内存好像分两种:栈,堆。
在堆上面分配是不是(只有)new和delete这种方法?
再栈上面分配,是不是(只有)局部变量?
另外栈,堆所能使用的系统内存有没有限制?
好像堆上面是没有的,直到系统的虚拟内存都用光了才会无法分配。
那么栈上面呢?好像能在栈上面分配的内存很少,只有几k。

解决方案 »

  1.   

    堆和栈的大小可以分别使用/HEAP和/STACK指定,new/delete操作的是C++的全局堆。
    When new is used to allocate memory for a C++ class object, the object's constructor is called after the memory is allocated.Use the delete operator to deallocate the memory allocated with the new operator.When delete is used to deallocate memory for a C++ class object, the object's destructor is called before the object's memory is deallocated (if the object has a destructor).
      

  2.   

    在堆上面分配是不是(只有)new和delete这种方法?   ==> 还有c方式的malloc,最常用的是new ,delete
      

  3.   

    对于需要占用较多内存的局部变量或函数参数参数建议使用new/delete.
      

  4.   

    1.从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
      
      2.在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。  3.从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
      

  5.   

    我现在遇到的问题是由一个操作数据库表的功能,原来是想把中间数据存到oracle的临时表里面。但是性能评测的时候发现如果数据量很大(比如三百万条数据),那么操作时间将会是六天左右(计算出来的,并不是实际测得)。现在我们想把放到临时表的数据放到内存里面操作,这样速度会提高很多,但是不知道这么多的数据在vc里面会不会引发内存不足的问题。
    现在我们假设server的内存足够大,关键就是如果我们都使用局部变量,而不是通过new来在堆上面申请,会不会出现由于栈“分配的内存容量有限”,使得本来我们可以用到的内存无法使用,造成程序错误。
    就是说栈“分配的内存容量有限”究竟是什么限制?如何限制?或者有什么更好的解决方法(用new的办法算一种)。
      

  6.   

    在Windows上分配大空间的问题,没接触过,不知道有怎样的限制。 感觉上,楼主的做法,想把数据库中的数据放到内存中提高速度,是可行的。然而一次性全部缓存到内存,也不是个最好的办法。
    是否可以考虑,分次提取、操作数据。这样虽然增加了从数据库读取数据的次数,但是处理的速度应该比较好,而且不容易产生内存不足的现象。
    定义一个size,如果数据超出这个size,就分次读取。可以将buffer定义在栈上,也可以定义在堆上。
      

  7.   

    按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的.静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求.栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,但是规定在运行中进入一个程序模块时,必须知道该程序模块所需的数据区大小才能够为其分配内存.和我们在数据结构所熟知的栈一样,栈式存储分配按照先进后出的原则进行分配。静态存储分配要求在编译时能知道所有变量的存储要求,栈式存储分配要求在过程的入口处必须知道所有的存储要求,而堆式存储分配则专门负责在编译时或运行时模块入口处都无法确定存储要求的数据结构的内存分配,比如可变长度串和对象实例.堆由大片的可利用块或空闲块组成,堆中的内存可以按照任意顺序分配和释放.上面的所提到的定义从编译原理的教材中总结而来,除静态存储分配之外,其他的,我觉得都显得很呆板和难以理解。从堆和栈的功能和作用来通俗的比较,堆主要用来存放对象的,栈主要是用来执行程序的.而这种不同又主要是由于堆和栈的特点决定的:在编程中,例如C/C++中,所有的方法调用都是通过栈来进行的,所有的局部变量,形式参数都是从栈中分配内存空间的。实际上也不是什么分配,只是从栈顶向上用就行,就好像工厂中的传送带(conveyor belt)一样,Stack Pointer会自动指引你到放东西的位置,你所要做的只是把东西放下来就行.退出函数的时候,修改栈指针就可以把栈中的内容销毁.这样的模式速度最快,当然要用来运行程序了.需要注意的是,在分配的时候,比如为一个即将要调用的程序模块分配数据区时,应事先知道这个数据区的大小,也就说是虽然分配是在程序运行时进行的,但是分配的大小多少是确定的,不变的,而这个"大小多少"是在编译时确定的,不是在运行时.堆是应用程序在运行的时候请求操作系统分配给自己内存,由于从操作系统管理的内存分配,所以在分配和销毁时都要占用时间,因此用堆的效率非常低.但是堆的优点在于,编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间,因此,用堆保存数据时会得到更大的灵活性。事实上,面向对象的多态性,堆内存分配是必不可少的,因为多态变量所需的存储空间只有在运行时创建了对象之后才能确定.在C++中,要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存.当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!这也正是导致我们刚才所说的效率低的原因。