首页 > 系统相关 >【C++】动态内存管理 ⑤ ( 基础数据类型数组 内存分析 | 类对象 内存分析 | malloc 分配内存 delete 释放 | new 分配内存 free 释放内存 )

【C++】动态内存管理 ⑤ ( 基础数据类型数组 内存分析 | 类对象 内存分析 | malloc 分配内存 delete 释放 | new 分配内存 free 释放内存 )

时间:2023-09-25 17:33:39浏览次数:46  
标签:释放 int malloc 分配内存 内存 Student new



文章目录

  • 一、基础数据类型数组 内存分析
  • 1、malloc 分配内存 delete 释放内存
  • 2、new 分配内存 free 释放内存
  • 二、类对象 内存分析
  • 1、malloc 分配内存 delete 释放内存
  • 2、new 分配内存 free 释放内存




博客总结 :

  • C 语言中 使用 malloc 分配的内存 , 使用 free 进行释放 ;
  • C++ 语言中 推荐 使用 new 分配的内存 , 使用 delete 进行释放 ;
  • 对于类对象来说 :
  • 使用 new 操作符 , 可以自动调用 类构造函数 进行初始化操作 ;
  • 使用 delete 操作符 , 可以自动调用 类析构函数 进行析构操作 ;
  • 因此这里建议 使用 new 创建类对象 , 使用 delete 释放对象 ;
  • 对于普通类型来说 :
  • new 操作符 与 malloc 函数 作用相同 , 都是在堆内存中为 数据分配内存 ;
  • delete 操作符 与 free 函数 作用相同 , 都是在堆内存中为 数据分配内存 ;





一、基础数据类型数组 内存分析



这里特别注意 , 本章节分析的 基础数据类型 的 数组 的 内存分配与释放 ,

注意与 类对象 数组 的内存动态管理 进行区分 ;



1、malloc 分配内存 delete 释放内存



使用 malloc 函数 , 为 基础数据类型数组 分配内存 , 是可以使用 delete 操作符 释放该内存的 ;



首先 , 使用 malloc 函数 , 为 int 数组分配内存空间 , 数组中存在 2 个 int 类型的元素 ;

int* p = (int*)malloc(sizeof(int) * 2);

然后 , 使用 delete 操作符 , 将 上述分配的 int 数组内存进行释放 ;

delete(p);

上述过程执行正常完成 , 期间没有报错 ;



代码示例 :

#include "iostream"
using namespace std;

int main()
{

	// 使用 malloc 申请数组 内存空间
	int* p = (int*)malloc(sizeof(int) * 2);
	p[0] = 10;
	p[1] = 20;

	cout << "p[0] = " << p[0] << " , p[1] = " << p[1] << endl;

	// malloc 申请的内存 使用 delete 释放
	delete(p);


	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
}

执行结果 : 上述代码可以正常执行 , 没有警告与报错 , 说明对于 基础数据类型的数组 来说 , malloc 与 new 的操作是一致的 , 使用 malloc 分配的堆内存 , 使用 delete 也可以释放 ;

p[0] = 10 , p[1] = 20
Press any key to continue . . .

【C++】动态内存管理 ⑤ ( 基础数据类型数组 内存分析 | 类对象 内存分析 | malloc 分配内存 delete 释放 | new 分配内存 free 释放内存 )_delete



2、new 分配内存 free 释放内存



使用 new 操作符 , 为 基础数据类型数组 分配内存 , 可以使用 free 函数 释放该内存 ;



首先 , 使用 new 操作符 , 为 int 数组分配内存空间 , 数组中存在 2 个 int 类型的元素 ;

int* p = new int[2];

然后 , 使用 free 函数 , 将 上述分配的 int 数组内存进行释放 ;

free(p);

上述过程执行正常完成 , 期间没有报错 ;



代码示例 :

#include "iostream"
using namespace std;

int main()
{

	// 使用 new 申请数组 内存空间
	int* p = new int[2];
	p[0] = 10;
	p[1] = 20;

	cout << "p[0] = " << p[0] << " , p[1] = " << p[1] << endl;

	// new 申请的内存 使用 free 释放
	free(p);


	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
}

执行结果 : 上述代码可以正常执行 , 没有警告与报错 , 说明对于 基础数据类型的数组 来说 , malloc 与 new 的操作是一致的 , 使用 new 分配的堆内存 , 使用 free 也可以释放 ;

【C++】动态内存管理 ⑤ ( 基础数据类型数组 内存分析 | 类对象 内存分析 | malloc 分配内存 delete 释放 | new 分配内存 free 释放内存 )_free_02






二、类对象 内存分析




1、malloc 分配内存 delete 释放内存



使用 malloc 函数 为 Student 类对象分配 堆内存 , 不会调用 Student 的构造函数 , 只是单纯的在 堆内存中分配了一块内存 ;

Student* p = (Student*)malloc(sizeof(Student));

分配完内存后 , 可以使用 p->m_age 访问 Student 对象的成员 ;

使用 delete 操作符 , 可以释放有 malloc 申请的 类对象内存空间 , 该操作会调用 Student 类的析构函数 ;

delete(p);



代码示例 :

#include "iostream"
using namespace std;

class Student
{
public:
	// 带参构造函数
	Student(int age, int height)
	{
		m_age = age;
		m_height = height;
		cout << "执行 Student 的构造函数" << endl;
	}

	~Student()
	{
		cout << "执行 Student 的析构函数" << endl;
	}

public:
	int m_age;		// 年龄
	int m_height;	// 身高
};

int main()
{

	// 使用 malloc 申请 Student 对象的 内存空间
	// malloc 不会调用 类对象的 构造函数
	Student* p = (Student*)malloc(sizeof(Student));

	cout << "p->m_age = " << p->m_age << " , p->m_height = " << p->m_height << endl;

	// malloc 申请的内存 使用 delete 释放
	delete(p);


	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
}

执行结果 :

p->m_age = -842150451 , p->m_height = -842150451
执行 Student 的析构函数
Press any key to continue . . .

【C++】动态内存管理 ⑤ ( 基础数据类型数组 内存分析 | 类对象 内存分析 | malloc 分配内存 delete 释放 | new 分配内存 free 释放内存 )_free_03



2、new 分配内存 free 释放内存



使用 new 操作符 为 Student 类对象分配 堆内存 , 会调用 Student 的构造函数 , 先在堆内存为 Student 对象分配内存 , 然后再调用构造函数进行初始化 ;

// 使用 new 操作符 申请 Student 对象的 内存空间
	// new 操作符 会调用 类对象的 构造函数
	Student* p = new Student(10, 150);

分配完内存后 , 可以使用 p->m_age 访问 Student 对象的成员 ;

使用 free 函数 可以释放 由 new 操作符 申请的 类对象内存空间 , 该操作不会调用 Student 类的析构函数 ;

// new 操作符 申请的内存 使用 free 释放
	free(p);



代码示例 :

#include "iostream"
using namespace std;

class Student
{
public:
	// 带参构造函数
	Student(int age, int height)
	{
		m_age = age;
		m_height = height;
		cout << "执行 Student 的构造函数" << endl;
	}

	~Student()
	{
		cout << "执行 Student 的析构函数" << endl;
	}

public:
	int m_age;		// 年龄
	int m_height;	// 身高
};

int main()
{

	// 使用 new 操作符 申请 Student 对象的 内存空间
	// new 操作符 会调用 类对象的 构造函数
	Student* p = new Student(10, 150);

	cout << "p->m_age = " << p->m_age << " , p->m_height = " << p->m_height << endl;

	// new 操作符 申请的内存 使用 free 释放
	free(p);


	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
}

执行结果 : 执行时 , 使用 new 操作符调用了 Student 对象的构造函数 ,

执行 Student 的构造函数
p->m_age = 10 , p->m_height = 150
Press any key to continue . . .

【C++】动态内存管理 ⑤ ( 基础数据类型数组 内存分析 | 类对象 内存分析 | malloc 分配内存 delete 释放 | new 分配内存 free 释放内存 )_delete_04


标签:释放,int,malloc,分配内存,内存,Student,new
From: https://blog.51cto.com/u_14202100/7597530

相关文章

  • Java内存模型
    JavaMemoryModel,JMM是一种规范,定义了程序中各个变量的访问规则,以及在某个线程中对这些变量进行访问时需要遵守的同步策略,所以其目的是解决多线程正确执行的问题。Java内存模型确保了多线程程序的可见性、有序性和原子性;主要内容包括:主内存(MainMemory):所有变量都存储在主内......
  • #define 定义的明示变量就是在预处理阶段用标识符后面的值替换标识符,因此不会占据内存
    1.常考:预处理阶段只进行文本替换,不进行运算对于最后一条,预处理指令定义的标识符都不会占据内存。预处理指令也称预编译指令,即在编译之前进行一些处理,而预处理做的其实就是文本替换,这个过程也叫做宏展开,即用宏定义后面的替换体将程序中出现宏的地方替换掉。例如,#define定义的明示......
  • Java内存模型——基础
    JMM因何产生由于计算机的存储设备与处理器的运算能力之间有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲——将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回......
  • 全局数组未加锁访问溢出导致才内存
    在客户那里发现有些数据包被错误的转到了standbySMM上,后面查看proc发现是knet.ko中的role字段被踩后面再检查发现有三个字段都被踩:zyc@fishsmm_arm64(/≧▽≦)/~/do_not_remove/aarch64-marvell-linux-gnu-nmlinux-casa-knet.ko|grepsmm_role0000000006925110B......
  • 【C语言菜鸟知识】——动态内存管理
    --------------------------------------------------------------------------------------------------------------------- 1、栈在全局变量是分配在内存中的静态储存区,非静态的局部变量是分配在内存中的动态储存区,这个储存区就是栈的区域。2、堆在内存中允许建立内存动态分......
  • C语言动态内存分配
      #include<iostream>#include<stdio.h>int*removeDuplicates(intnumsSize){//malloc是常用的动态内存分配int*arr=(int*)malloc(numsSize*sizeof(int));returnarr;}intmain(){intnumsSize=10;int*arr;a......
  • 7.7 实现进程内存读写
    内存进程读写可以让我们访问其他进程的内存空间并读取或修改其中的数据。这种技术通常用于各种调试工具、进程监控工具和反作弊系统等场景。在Windows系统中,内存进程读写可以通过一些API函数来实现,如OpenProcess、ReadProcessMemory和WriteProcessMemory等。这些函数提供了一种通......
  • win32汇编-80386的内存分页机制
     读者可以注意到,在实模式下寻址的时候,“段寄存器+偏移地址”经过转换计算以后得到的地址是“物理地址”,也就是在物理内存中的实际地址。而保护模式下,“段选择器+偏移地址”转换后的地址被称为“线性地址”而不是“物理地址”。那么,线性地址就是物理地址吗?答案可能是“是”,也可......
  • crash —— 获取系统内存使用统计数据
    crash>kmem-iPAGESTOTALPERCENTAGETOTALMEM197646761754GB----FREE33983015129.6GB17%ofTOTALMEMUSED163663746624.3GB82%ofTOTALMEMSHARED139137......
  • crash —— 获取物理内存布局信息
    crash>mach-mPHYSICALADDRESSRANGETYPE0000000000000000-0000000000001000E820_RESERVED0000000000001000-000000000006e000E820_RAM000000000006e000-0000000000070000E820_RESERVED0000000000070000-00000000000a0000E820_RAM0......