问题描述
- 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的都在堆上,这是固定的。
解决方案八:
栈上分配快,但是空间比较小,而且局部变量等数据在栈上,它会自动释放,而堆的生命期受你控制,可以分配的空间大