指针-c++对象内存分配的问题,如何确定在堆上还是在栈上?

问题描述

c++对象内存分配的问题,如何确定在堆上还是在栈上?

c++中对象内存放堆上还是在栈上是不是根据对象实例化的方法,如:
A a; //在栈中分配内存
A * a = new A(); //动态内存分配,在堆上

要是这样,如果我尽量不用指针的话(这样程序风格似乎更加清晰一些),那是不是对象都分配到栈上了?这有什么弊端吗?栈的空间是不是很有限?是不是为了栈空间的问题我们必须尽量多用new分配内存呢?类成员是不是也要多用指针呢?

解决方案

经过昨晚大家的热心帮助,对该问题的疑问已经烟消云散,谢谢大家!在此总结一下:
“非new的对象在栈中分配,new的对象在堆中分配” 这句话是没有问题的。而这个
class A {
public:
A(void) :v1(10) { v1[0] = "abc"; }
vector v1;
};
只是一个类的定义,还没有实例化,是不涉及到任何内存分配的,根本不适用于内存分配原则。就算实例化后,v1变量只是a对象的一个成员变量,它在堆上还是在栈上是由a对象的分配方式决定的,而不是由其声明方式决定的。

解决方案二:

用new分配的一个很重要的原因不仅是在堆上分配控件,而是说需要分配多少空间在编写程序的时候不确定。特别是数组,如果要不用动态分配,我们必须在开发的时候估算数组大小的上限,以防不够用。
但是多半这么做是浪费的。
堆栈的确有容量的限制,特别是当你递归调用的时候,对堆栈使用越多,你的递归层数就越少。
但是堆栈的好处是,它会自动分配/清栈,而动态分配你必须时刻小心,及时释放,以免内存泄漏。

解决方案三:

我说的是编译时和运行时。

比如说,你的程序是这个逻辑:
请输入数组的大小:
xxx
请输入每个元素
x
x
x
结果是
xxx
显然,这里对于运行时,我们可以知道大小,但是对于编译时,我们就不知道大小。

解决方案四:

多年前,我看了32bit windows的内存分配,栈的默认大小是2MB,而堆应该是2GB。
在栈上访问内存理论上来讲效率高一些,但是大规模数据的话,不够用。

解决方案五:

堆与栈都有不同的使用情况,对于动态数据,比较大的结构体,类,我们建议使用new,放在堆中,栈中主要还是改局部变量和函数调用栈使用的,栈的大小 是有限的!
动态分配内存时可以使用智能指针来包装,使用RAII原则,基本上可以解决内存泄漏问题。

解决方案六:

堆与栈都有不同的使用情况,对于动态数据,比较大的结构体,类,我们建议使用new,放在堆中,栈中主要还是改局部变量和函数调用栈使用的,栈的大小 是有限的!
动态分配内存时可以使用智能指针来包装,使用RAII原则,基本上可以解决内存泄漏问题。

解决方案七:

晕,我没有这么说,编译器会判断和决定如何分配内存。你定义的局部变量都在堆栈上,而malloc new的都在堆上,这是固定的。

解决方案八:

栈上分配快,但是空间比较小,而且局部变量等数据在栈上,它会自动释放,而堆的生命期受你控制,可以分配的空间大

时间: 2024-09-10 04:20:11

指针-c++对象内存分配的问题,如何确定在堆上还是在栈上?的相关文章

对象内存分配-Java对象中的对象如何分配内存?

问题描述 Java对象中的对象如何分配内存? 在Java中,比如A a=new A ();是在堆内存中创建了一个对象,然后把这个对象的引用传递给栈内存中的对象变量a.那如果a对象拥有一个字符串对象,那a对象中保存的是这个字符串对象的引用吗? 解决方案 a是A类型的.不能拥有一个字符串对象. 如果A中有一个字符串字段,那一样的,堆上的a中存储着指向这个字符串的引用.字符串本身则放在常量池或者也在堆上. 解决方案二: 不知道是不是这个意思:将字符串对象符值给a,这是不可以的,除非是相同类型,如果A是

指针-一个动态内存分配的问题,函数执行后p指向哪里?

问题描述 一个动态内存分配的问题,函数执行后p指向哪里? 一下是我的代码: #include<stdio.h> #include<stdlib.h> #include<string.h> char *strcnp(char *sd,char *ds) { char *q=sd; while((*ds++=*sd++)!='') NULL; return q; } int main() { char *a[4]={"abc","def&quo

关于实例化对象内存分配的问题

问题描述 我想知道.net中,实例化一个对象时,系统为我们做了哪些事,怎样分配内存? 解决方案 解决方案二:学习,帮顶解决方案三:.net内存管理:http://www.cnblogs.com/RicCC/archive/2009/09/01/1558308.html解决方案四:观望..解决方案五:Google一下new解决方案六:在栈中会添加一个引用,此引用记录了一个内存分配的地址,此地址在托管堆上.解决方案七:学习中解决方案八:看一下王涛写的你必须知道的.Net,上面讲得比较详细

源码分析:Java对象的内存分配

Java对象的分配,根据其过程,将其分为快速分配和慢速分配两种形式,其中快速分配使用无锁的指针碰撞技术在新生代的Eden区上进行分配,而慢速分配根据堆的实现方式.GC的实现方式.代的实现方式不同而具有不同的分配调用层次.  下面就以bytecodeInterpreter解释器对于new指令的解释出发,分析实例对象的内存分配过程: 一.快速分配 1.实例的创建首先需要知道该类型是否被加载和正确解析,根据字节码所指定的CONSTANT_Class_info常量池索引,获取对象的类型信息并调 用is_

解析Java程序中对象内存的分配和控制的基本方法_java

一.对象与内存控制的知识点 1.java变量的初始化过程,包括局部变量,成员变量(实例变量和类变量). 2.继承关系中,当使用的对象引用变量编译时类型和运行时类型不同时,访问该对象的属性和方法是有区别的. 3.final修饰符特性. 二.java变量的划分与初始化过程 java程序的变量大体可以分为成员变量和局部变量,成员变量可以分为实例变量(非静态变量)和类变量(静态变量),一般我们遇到的局部变量会在下列几种情况中出现: (1)形参:在方法签名中定义的局部变量,由调用方为其赋值,随着方法结束消

关于Java 数组内存分配一点认识

 可能Java 数组大家都很熟悉,最近我遇到了一个关于Java 数组内存分配的问题.         呵呵.突然就发现许多书上"基本数据类型存储在栈内存当中,对象则保存在堆内存"这句话完全是错误的.下面是个简单的例子代码: public class Test { public static void main(String[] argv) { // 静态初始化数组 String[] names = { "Michael", "Orson", &q

基于Java 数组内存分配的相关问题_java

可能Java 数组大家都很熟悉,最近我遇到了一个关于Java 数组内存分配的问题.呵呵.突然就发现许多书上"基本数据类型存储在栈内存当中,对象则保存在堆内存"这句话完全是错误的.下面是个简单的例子代码: 复制代码 代码如下: public class Test {    public static void main(String[] argv) {// 静态初始化数组String[] names = { "Michael", "Orson",

简明分析C/C++内存分配的解决方案

C/C++的内存分配(通过malloc或new)可能需要花费很多时. 更糟糕的是,随 着时间的流逝,内存(memory)将形成碎片,所以一个应用程序的运行会越来越慢.当它 运行了很长时间和/或执行了很多的内存分配(释放)操作的时候.特别是,你经常申请 很小的一块内存,堆(heap)会变成碎片的. 解决方案:你自己的内存池一个( 可能的)解决方法是内存池(Memory Pool). 在启动的时候,一个"内存 池"(Memory Pool)分配一块很大的内存,并将会将这个大块(block)

c++有没有内存分配查看工具啊

问题描述 c++有没有内存分配查看工具啊 有没有一个工具可以查看c++对象内存分配情况呢?至少可以得到有哪些对象,分别是分配在堆上还是栈上等信息? 解决方案 根本不用看,我说了,这是固定的.局部变量在堆栈上,动态分配的在堆上. 解决方案二: 有内存泄露检测工具...... 解决方案三: 主要是从语法上来理解,直接查看的工具没有,一般也就是nm readelf等分析.