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

一、new创建类对象与不new区别

 

  1. new创建类对象需要指针接收
  2. new创建类对象使用完需delete销毁
  3. new创建对象直接使用堆空间,而局部不用new定义类对象则使用栈空间
  4. new对象指针用途广泛,比如作为函数返回值、函数参数等
  5. 频繁调用场合并不适合new,就像new申请和释放内存一样

 

二、创建对象实例

1. 使用new创建对象

CTest* pTest = new CTest();

delete pTest;

pTest是用来接收类的对象指针。new申请的对象,则只有调用到delete时再会执行析构函数,如果程序退出而没有执行delete则会造成内存泄漏。

 

2. 不使用new,直接使用类定义声明:

CTest mTest;

此种创建方式,使用完后不需要手动释放,该类析构函数会自动执行。

 

#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,在堆中分配了内存,栈中内存的分配和释放是由系统管理,堆中内存的分配和释放必须由程序员手动释放。

三、总结

一般来说对于一个进程栈的大小远远小于堆的大小,在Window下,栈的大小是2MB,Linux下,默认栈空间大小为8MB。对于堆,比如32位系统最大不超过2G,而64位系统最大不超过4G,当需要分配一个非常大的内存时,请用new。

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

由上可知,一般情况不使用new,直接使用类定义声明,申请内存特别大的情况下,或者作为函数返回值时,使用new创建对象。


版权声明:本文为qq826364410原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。