【C++】动态内存管理 ⑤ ( 基础数据类型数组 内存分析 | 类对象 内存分析 | malloc 分配内存 delete 释放 | 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 . . .

在这里插入图片描述


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 也可以释放 ;

在这里插入图片描述





二、类对象 内存分析




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 . . .

在这里插入图片描述


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 . . .

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/han1202012/article/details/133132239