C++用new来创建对象和非new来创建对象的区别
1个回答
展开全部
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,即用堆。
#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,即用堆。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询