new/delete表达式

new/delete的简单使用

#include <iostream>

using std::cout;
using std::endl;

//在C中用来开辟和回收空间的方式是采用malloc/free库函数
//在C++中提供了新的开辟和回收空间的方式,采用new/delete表达式 
int main()
{
  //开辟一个元素空间
  int *p = new int(1); 
  cout << "*p = " << *p << endl;
  delete p;

  //开辟一个数组空间,注意使用 []
  int *q = new int[10]();
  for(int i = 0; i < 10; ++i)
  {
    q[i] = i;
  }
  for(int i = 0; i < 10; ++i)
  {
    cout << "q[" << i <<"] = " << q[i] << endl;
  }
  // 释放数组空间的时候,注意 []
  delete []q;

  return 0;
}

new/delete表达式与malloc/free的区别

  - malloc/free是C/C++的库函数,new/delete是C++的表达式
  - new能够自动分配空间大小,malloc需要传入参数
  - new开辟空间的同时还对空间做了初始化的操作,而malloc不行  
  - new/delete能对对象进行构造和析构函数的调用,进而对内存进行更加详细的工作,而malloc/free不能
  malloc/free,new/delete都是成对出现的,且必须成对出现,否则可能出现内存泄露
new/delete的功能完全覆盖了malloc/free,为什么C++还保留malloc/free?
  C++程序要经常调用C函数,而C程序只能用malloc/free管理动态内存

new表达式工作步骤

  - 调用名为operator new的标准库函数,分配足够大的原始的未类型化的内存,以保存指定类型的一个对象
  - 运行该类型的一个构造函数初始化对象
  - 返回指向新分配并构造的构造函数对象的指针

delete表达式工作步骤

  - 调用析构函数,回收对象中数据成员所申请的资源
  - 调用名为operator delete的标准库函数释放该对象所用的内存
posted @ 2021-04-15 11:59  xkyrl  阅读(58)  评论(0编辑  收藏  举报