文章目录
- 前言
- 一、C/C++的内存分布
- 二、C/C++动态内存管理
- 总结
前言
C/C++的内存分布、动态内存管理等的介绍
一、C/C++的内存分布
因为程序在运行过程中需要存储一些不同的数据,所以需要对内存空间进行分类
二、C/C++动态内存管理
C语言动态内存管理是malloc / calloc / realloc / free等来实现的
C++通过new和delete操作符进行动态内存管理。new和delete是新的关键词
#include <iostream>
using namespace std;
int main()
{
// 动态申请 1 个int类型的空间
// C
int* p1 = (int*)malloc(sizeof(int));
free(p1);
// CPP
int* p2 = new int;
delete p2;
// 动态申请 10 个int类型的空间
// C
int* p3 = (int*)malloc(sizeof(int) * 10);
free(p3);
// CPP
int* p4 = new int[10];
delete[] p4;
// CPP 动态申请 1 个int类型的空间并初始化为 10
int* p5 = new int(10);
delete p5;
// CPP 对动态申请的数组进行初始化
int* p6 = new int[10] {1, 2, 3};
delete[] p6;
return 0;
}
- C/C++动态申请空间默认都不会进行初始化
- C++可以采用 new int(10)对空间进行任意的初始化
- C++对数组进行初始化时,采用new int[10] {1, 2, 3}; 的形式,未指定空间默认初始化为0。
对于内置类型,C/C++的动态内存管理没有很大的区别,它们的区别主要在于自定义类型。
对于自定义类型,C语言的malloc很纯粹,不会进行初始化,需要调用函数。
C++可以在动态申请空间的同时,通过调用自定义类型的构造函数来进行初始化。
#include <iostream>
using namespace std;
struct ListNode
{
int _val;
struct ListNode* _next;
ListNode(int x)
: _val(x)
, _next(NULL)
{
}
};
ListNode* BuyNewNode(int x)
{
struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
if (newNode == NULL)
{
return NULL;
}
newNode->_val = x;
newNode->_next = NULL;
return newNode;
}
int main()
{
// C语言创建链表节点
struct ListNode* n1 = BuyNewNode(1);
struct ListNode* n2 = BuyNewNode(2);
struct ListNode* n3 = BuyNewNode(3);
// CPP创建链表节点
ListNode* nn1 = new ListNode(1);
ListNode* nn2 = new ListNode(2);
ListNode* nn3 = new ListNode(3);
return 0;
}
总结
C/C++的内存分布、动态内存管理等的介绍