文章目录
- 一、基础数据类型数组 内存分析
- 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 . . .
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 . . .