目录
2. C语言中动态内存管理方式:malloc/calloc/realloc/free
4. operator new与operator delete函数
4.1 operator new与operator delete函数(重点!)
1. C/C++内存分布
判断下面代码中的各个变量的内存分布。
int globalVar = 1;//静态区
static int staticGlobalVar = 1;//静态区
void Test()
{
static int staticVar = 1;//静态区
int localVar = 1;//栈区
int num1[10] = { 1, 2, 3, 4 };//栈区
char char2[] = "abcd";//char2——栈区,*char2——栈区(首元素)
const char* pChar3 = "abcd";//char3——栈区(局部变量),*char3——常量区
int* ptr1 = (int*)malloc(sizeof(int) * 4);//ptr1——栈区,*ptr1——堆区
free(ptr1);
}
结论:
1.static修饰
全局变量——静态区
局部变量——静态区
2.const修饰
全局变量——静态区
局部变量——栈
3。动态开辟的空间——堆区
4.字符串数组——静态区/栈
字符串指针——常量区(只读)
【说明】1. 栈又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是 向下增长 的。2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。3. 堆用于程序运行时动态内存分配,堆是可以 向上增长 的。4. 数据段(静态区)--存储全局数据和静态数据。5. 代码段(常量区)--可执行的代码/只读常量。
2. C语言中动态内存管理方式:malloc/calloc/realloc/free
1.malloc/calloc/realloc的区别是什么?
malloc
:void *malloc(unsigned int num_bytes);用于分配指定字节大小的内存空间,并返回一个指向这块内存的指针。分配的内存空间不会被初始化,其内容是未定义的。
num_bytes——要申请的空间大小
calloc
:void *calloc(size_t n, size_t size);与
malloc
类似,但它会分配一块连续的内存空间,并且将分配的内存初始化为零。n——需要分配的元素数量,
size——每个元素的大小
注:效率较malloc要低
realloc
:void realloc(void *ptr, size_t new_Size);用于调整之前通过
malloc
、calloc
或realloc
分配的内存块的大小ptr——指向原来空间的指针
new_Size——新的空间大小
2.这里需要free(p2)吗?
void Test () { int* p2 = (int*)calloc(4, sizeof (int)); int* p3 = (int*)realloc(p2, sizeof(int)*10); // 这里需要free(p2)吗? free(p3 ); }
不需要 调用
free(p2)
,因为它现在指向的内存可能已经被realloc
释放或重新分配。
3. C++内存管理方式
3.1 new/delete操作内置类型
void Test()
{
// 动态申请一个int类型的空间
int* ptr4 = new int;
// 动态申请一个int类型的空间并初始化为10
int* ptr5 = new int(10);
// 动态申请10个int类型的空间
int* ptr6 = new int[3];
delete ptr4;
delete ptr5;
delete[] ptr6;
}
3.2 new和delete操作自定义类型
int main()
{
// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间
//还会调用构造函数和析构函数
A* p1 = (A*)malloc(sizeof(A));
A* p2 = new A(1);
free(p1);
delete p2;
// 内置类型是几乎是一样的
int* p3 = (int*)malloc(sizeof(int)); // C
int* p4 = new int;
free(p3);
delete p4;
A* p5 = (A*)malloc(sizeof(A) * 10);
A* p6 = new A[10];
free(p5);
delete[] p6;
return 0;
}
4. operator new与operator delete函数
4.1 operator new与operator delete函数(重点!)
5. new和delete的实现原理
5.1 内置类型
5.2 自定义类型
new的原理
delete的原理
new T[N]的原理
delete[]的原理
6. malloc/free和new/delete的区别
7*.匹配使用的原因
class A
{
public:
~A()
{
cout << "~A()" << endl;
}
private:
int _a1 = 2;
int _a2 = 2;
};
class B
{
private:
int _b1 = 2;
int _b2 = 2;
};
int main()
{
//1内置类型,new[N]和delete匹配——没有问题
int* p1 = new int[10]; // -> malloc
delete p1; // -> free
//未报错
B* p2 = new B[10];
delete p2;
//报错
//A* p3 = new A[10];
//delete p3;
return 0;
}