用于动态内存的 C++ 中的 new 和 delete 运算符

简介: C/C++ 中的动态内存分配是指由程序员手动进行内存分配。动态分配的内存在堆上分配,非静态和局部变量在堆栈上分配内存。

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。


C/C++ 中的动态内存分配是指由程序员手动进行内存分配。动态分配的内存在堆上分配,非静态和局部变量在堆栈上分配内存。


什么是应用程序?


  • 动态分配内存的一种用途是分配可变大小的内存,这对于编译器分配的内存是不可能的,除了可变长度数组。

  • 最重要的用途是提供给程序员的灵活性。我们可以在需要和不再需要时自由分配和释放内存。这种灵活性在很多情况下都有帮助。此类情况的示例是Linked List、Tree


它与分配给普通变量的内存有何不同?


对于“int a”、“char str[10]”等普通变量,内存会自动分配和释放。对于像“int *p = new int[10]”这样的动态分配内存,程序员有责任在不再需要时释放内存。如果程序员不释放内存,则会导致内存泄漏(直到程序终止内存才会释放)。


在 C++ 中如何分配/释放内存?


C 使用malloc() 和 calloc()函数在运行时动态分配内存,并使用 free() 函数释放动态分配的内存。C++ 支持这些函数,并且还有两个运算符newdelete,它们以更好、更简单的方式执行分配和释放内存的任务。


这篇文章是关于 new 和 delete 操作符的。


new 运算符


new 运算符表示在 Free Store 上分配内存的请求。如果有足够的内存可用,new 操作符会初始化内存并将新分配和初始化的内存的地址返回给指针变量。


  • 使用 new 运算符的语法:要分配任何数据类型的内存,语法为:
指针变量 = new data-type;
复制代码

  • 这里,指针变量是数据类型类型的指针。数据类型可以是任何内置数据类型,包括数组或任何用户定义的数据类型,包括结构和类。
  • 例子:

// 指针初始化为 NULL 然后为变量请求内存
int *p = NULL; 
p = new int;   
复制代码


或者

// 结合指针的声明和它们的赋值
int *p = new int; 
复制代码


初始化内存: 我们也可以使用 new 操作符来初始化内存:


pointer-variable = new data-type(value);
Example:
int *p = new int(25);
float *q = new float(75.25);
复制代码


分配内存块:  new 运算符也用于分配数据类型的内存块(数组)。


pointer-variable = new data-type[size];
复制代码


其中 size(a variable) 指定数组中元素的数量。


int *p = new int[10]
复制代码


为连续 10 个 int 类型的整数动态分配内存,并返回指向序列第一个元素的指针,该元素被分配给 p(a pointer)。p[0] 指的是第一个元素,p[1] 指的是第二个元素,依此类推。


普通数组声明与使用 new


声明普通数组和使用 new 分配内存块之间存在差异。最重要的区别是,普通数组由编译器释放(如果数组是本地的,则在函数返回或完成时释放)。然而,动态分配的数组总是保留在那里,直到它们被程序员释放或程序终止。


如果在运行时没有足够的内存可用怎么办?


如果堆中没有足够的内存可供分配,则新请求通过抛出类型为 std::bad_alloc 的异常指示失败,除非“nothrow”与 new 运算符一起使用,在这种情况下它返回一个 NULL 指针(滚动到节中的“新的运营商的异常处理”文章)。因此,在使用它程序之前检查 new 产生的指针变量可能是个好主意。


int *p = new(nothrow) int;
if (!p)
{
   cout << "Memory allocation failed\n";
}
复制代码


delete 操作符


由于释放动态分配的内存是程序员的责任,因此 C++ 语言为程序员提供了删除运算符。

语法:


// 释放指针变量指向的内存
delete pointer-variable;  
复制代码


这里,pointer-variable 是指向new创建的数据对象的指针。


例子:

delete p;
  delete q;
复制代码


要释放指针变量指向的动态分配数组,请使用以下形式的delete


// 释放指针变量指向的内存块
delete[] pointer-variable;  
复制代码


例如:


// 它将释放 p 指向的整个数组。
   delete[] p;
复制代码
// 使用 new 和 delete 说明动态分配和释放内存的 C++ 程序
#include <iostream>
using namespace std;
int main ()
{
  int* p = NULL;
  p = new(nothrow) int;
  if (!p)
    cout << "allocation of memory failed\n";
  else
  {
    *p = 29;
    cout << "Value of p: " << *p << endl;
  }
  float *r = new float(75.25);
  cout << "Value of r: " << *r << endl;
  int n = 5;
  int *q = new(nothrow) int[n];
  if (!q)
    cout << "allocation of memory failed\n";
  else
  {
    for (int i = 0; i < n; i++)
      q[i] = i+1;
    cout << "Value store in block of memory: ";
    for (int i = 0; i < n; i++)
      cout << q[i] << " ";
  }
  delete p;
  delete r;
  delete[] q;
  return 0;
}
复制代码


输出:


Value of p: 29
Value of r: 75.25
Value store in block of memory: 1 2 3 4 5



目录
相关文章
|
4月前
|
安全 C语言 C++
比较C++的内存分配与管理方式new/delete与C语言中的malloc/realloc/calloc/free。
在实用性方面,C++的内存管理方式提供了面向对象的特性,它是处理构造和析构、需要类型安全和异常处理的首选方案。而C语言的内存管理函数适用于简单的内存分配,例如分配原始内存块或复杂性较低的数据结构,没有构造和析构的要求。当从C迁移到C++,或在C++中使用C代码时,了解两种内存管理方式的差异非常重要。
172 26
|
编译器 C++ 开发者
【C++】深入解析C/C++内存管理:new与delete的使用及原理(三)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
228 3
|
程序员 C语言 C++
C++入门5——C/C++动态内存管理(new与delete)
C++入门5——C/C++动态内存管理(new与delete)
234 1
|
4月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
1402 0
|
4月前
|
存储 缓存 NoSQL
内存管理基础:数据结构的存储方式
数据结构在内存中的存储方式主要包括连续存储、链式存储、索引存储和散列存储。连续存储如数组,数据元素按顺序连续存放,访问速度快但扩展性差;链式存储如链表,通过指针连接分散的节点,便于插入删除但访问效率低;索引存储通过索引表提高查找效率,常用于数据库系统;散列存储如哈希表,通过哈希函数实现快速存取,但需处理冲突。不同场景下应根据访问模式、数据规模和操作频率选择合适的存储结构,甚至结合多种方式以达到最优性能。掌握这些存储机制是构建高效程序和理解高级数据结构的基础。
411 0
|
4月前
|
存储 弹性计算 固态存储
阿里云服务器配置费用整理,支持一万人CPU内存、公网带宽和存储IO性能全解析
要支撑1万人在线流量,需选择阿里云企业级ECS服务器,如通用型g系列、高主频型hf系列或通用算力型u1实例,配置如16核64G及以上,搭配高带宽与SSD/ESSD云盘,费用约数千元每月。
394 0
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
888 0
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
937 1

热门文章

最新文章