【C++】动态内存管理 ⑤ ( 基础数据类型数组 内存分析 | 类对象 内存分析 | malloc 分配内存 delete 释放 | new 分配内存 free 释放内存 )
  K1I6GvxBEuyy 2023年11月02日 102 0



文章目录

  • 一、基础数据类型数组 内存分析
  • 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 释放内存 )_c++



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 释放内存 )_malloc_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 释放内存 )_c++_04


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
K1I6GvxBEuyy
作者其他文章 更多