C++动态内存的分配、使用、释放

简介: C++动态内存的分配、使用、释放

new 和 delete 基本语法


1)在软件项目开发过程中,我们经常需要动态地分配和撤销内存空间,特 别是数据结构中结点的插入与删除。在 C 语言中是利用库函数 malloc 和 free 来 分配和撤销内存空间的。C++提供了较简便而功能较强的运算符 new 和 delete 来 取代 malloc 和 free 函数。


(注意: new 和 delete 是运算符,不是函数,因此执行效率高。)


2)虽然为了与 C 语言兼容,C++仍保留 malloc 和 free 函数,但建议用户不 用 malloc 和 free 函数,而用 new 和 delete 运算符。


new 运算符的例子:


new int; //开辟一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针)


new int(10); //开辟一个存放整数的空间,并指定该整数的初值为 10,返回一个指向该存 储空间的地址


new char[100]; //开辟一个存放字符数组(包括 100 个元素)的空间,返回首元素的地址


new int[5][4]; //开辟一个存放二维整型数组(大小为 5*4)的空间,返回首元素的地址


float *p=new float (3.14159); //开辟一个存放单精度数的空间,并指定该实数的 初值为//3.14159,将返回的该空间的地址赋给指针变量 p


3)new 和 delete 运算符使用的一般格式为:


                       new 运算符 动态分配堆内存


                       使用方法:


                       指针变量 = new 类型(常量);


                       指针变量 = new 类型[表达式]; //数组


                       指针变量 = new 类型[表达式][表达式] //二维数组


                       作用:从堆上分配一块“类型”指定大小的存储空间,返回首偶地址


                       其中:“常量”是初始化值,可缺省 创建数组对象时,不能为对象指定初始值


                       delete 运算符 释放已分配的内存空间


                       使用方式:


                       普通类型(非数组)使用: delete 指针变量;


                       数组 使用: delete[] 指针变量;


                       其中“指针变量” 必须时一个 new 返回的指针


// demo 9-5.c
#include <stdlib.h>
#include <iostream>
using namespace std;
//分配基础类型
int main01(void) 
{
  //第一种分配动态内存不执行初始化
  int* p1 = new int;
  *p1 = 100;
  //第二种分配动态内存同时执行初始化
  int* p2 = new int(100);
  // 第三种 malloc 返回值是 void *
  int* p3 = (int*)malloc(sizeof(int));
  free(p1); //基础类型可以 new free 可以混搭
  delete p3; //基础类型可以 malloc delete 可以混搭
  delete p2; //free(p2); 同样效果
  system("pause");
  return 0;
}
//分配数组变量
int main(void) 
{
  int* p1 = (int*)malloc(sizeof(int) * 10);
  //p[0] - p[9] *(p+9)
  int* p2 = new int[10];
  delete p1; // free(p1); 可以混搭
  //free(p2); //可以混搭
  delete[] p2;
  system("pause");
  return 0;
}


C++程序员的噩梦-内存泄漏

内存泄漏(Memory Leak) - 是指程序中己动态分配的堆内存由于某种原因程序未释放或 无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

// demo 9-6.c
#include <stdlib.h>
#include <iostream>
#include <stdio.h>
#include <Windows.h>
using namespace std;
void A_live() 
{
  int* p = new int[1024];
  //挥霍
  p[0] = 0;
  //申请的内存必须要“还”
}
void B_live() 
{
  int* p = new int[1024];
  //正常的开支
  p[0] = 0;
  delete[] p;
}
int main(void) 
{
  /*
  for(int i=0; i<100000; i++)
  {
  A_live();
  Sleep(50);
  }*/
  for (int i = 0; i < 100000; i++) 
  {
    B_live();
    Sleep(50);
  }
  system("pause");
  return 0;
}


相关文章
|
3月前
|
C++
【C++】深入解析C/C++内存管理:new与delete的使用及原理(二)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
3月前
|
编译器 C++ 开发者
【C++】深入解析C/C++内存管理:new与delete的使用及原理(三)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
3月前
|
存储 C语言 C++
【C++】深入解析C/C++内存管理:new与delete的使用及原理(一)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
103 2
|
17天前
|
存储 缓存 编译器
【硬核】C++11并发:内存模型和原子类型
本文从C++11并发编程中的关键概念——内存模型与原子类型入手,结合详尽的代码示例,抽丝剥茧地介绍了如何实现无锁化并发的性能优化。
|
2月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
198 13
|
2月前
|
存储 缓存 C语言
【c++】动态内存管理
本文介绍了C++中动态内存管理的新方式——`new`和`delete`操作符,详细探讨了它们的使用方法及与C语言中`malloc`/`free`的区别。文章首先回顾了C语言中的动态内存管理,接着通过代码实例展示了`new`和`delete`的基本用法,包括对内置类型和自定义类型的动态内存分配与释放。此外,文章还深入解析了`operator new`和`operator delete`的底层实现,以及定位new表达式的应用,最后总结了`malloc`/`free`与`new`/`delete`的主要差异。
62 3
|
2月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
177 4
|
3月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
121 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
3月前
|
存储 程序员 编译器
简述 C、C++程序编译的内存分配情况
在C和C++程序编译过程中,内存被划分为几个区域进行分配:代码区存储常量和执行指令;全局/静态变量区存放全局变量及静态变量;栈区管理函数参数、局部变量等;堆区则用于动态分配内存,由程序员控制释放,共同支撑着程序运行时的数据存储与处理需求。
200 22
|
3月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。