堆栈
堆(heap)和栈(stack)是计算机内存中两种不同的内存分配区域,用于存储程序运行时的数据。
-
堆(Heap):
-
动态分配的内存区域:堆是一种动态分配的内存区域,程序员可以在运行时通过特定的函数(如
new
和malloc()
)来动态地分配内存。 -
分配和释放由程序员管理:堆上的内存分配和释放是由程序员手动管理的,需要程序员调用相应的函数来分配和释放内存。因此,堆上的内存管理更加灵活,但也更容易出错。
-
生命周期不受限制:堆上分配的内存的生命周期不受限制,直到显式释放或程序结束时才会释放。
-
大小不固定:堆上的内存空间大小不固定,可以根据需要动态地增加或减少。
-
碎片化问题:频繁的堆内存分配和释放可能会导致堆内存的碎片化问题,降低内存利用效率。
-
-
栈(Stack):
-
自动分配的内存区域:栈是一种自动分配的内存区域,用于存储函数调用的上下文信息、局部变量和临时数据。
-
分配和释放由编译器自动管理:栈上的内存分配和释放是由编译器自动管理的,无需程序员手动干预。栈内存的分配和释放遵循函数的调用和返回,具有确定性。
-
生命周期受限于函数调用:栈上分配的内存的生命周期与函数调用的生命周期密切相关,当函数调用结束时,栈上的局部变量会被自动销毁。
-
大小有限:栈上的内存空间大小通常是有限的,并且受到操作系统或编译器的限制。
-
C++ 动态内存
在C++中,动态内存是在程序运行时分配和释放的内存,通常位于堆(heap)中。与栈(stack)上的内存分配不同,动态内存分配不需要在编译时知道内存大小或生命周期。动态内存的分配和释放是通过一组特殊的运算符和函数完成的。
在C语言中我们可以使用malloc()函数和free()函数进行内存的申请和释放,而在C++中我们则是用到两个运算符new和delete。
new
和 delete
运算符**:
new
运算符用于在堆上动态分配内存,并调用对象的构造函数来初始化对象。delete
运算符用于释放通过 new
分配的内存,并调用对象的析构函数来销毁对象。
char * szBuffer = new char[100]; //申请内存
memset(szBuffer, 0, 100); //将内存中的值改为0
delete szBuffer; //释放
此时内存中的值都被修改为0
释放资源后内存中的值:
malloc和new
new
和malloc()
都是用于在程序运行时动态分配内存的方法,它们之间存在一些联系:
-
内存分配:
-
new
和malloc()
都可以用于在堆(heap)上动态分配内存。 -
new
用于在堆上动态分配对象的内存,它可以调用对象的构造函数进行初始化,并返回指向对象的指针。 -
malloc()
用于在堆上动态分配原始的、未初始化的内存块,它返回一个指向分配内存区域的指针,不涉及对象的构造和初始化。
-
-
用法:
-
new
是 C++ 中的一个运算符,而malloc()
是 C 语言标准库中的一个函数。 -
new
可以自动计算所需内存的大小,而malloc()
需要显式地指定要分配的内存大小。 -
new
返回的指针类型是根据分配的对象类型确定的,而malloc()
返回的是void*
类型的指针,需要手动进行类型转换。
-
-
内存释放:
-
使用
new
分配的内存应该使用delete
运算符来释放,或者使用delete[]
运算符释放数组内存。 -
使用
malloc()
分配的内存应该使用free()
函数来释放。
-
C中使用malloc free进行内存的申请和释放。
free和delete
-
用法:
-
free()
是 C 语言标准库中的函数,用于释放使用malloc()
或calloc()
分配的内存。 -
delete
是 C++ 中的关键字,用于释放使用new
或new[]
分配的内存。
-
-
类型:
-
free()
函数的参数是一个指向动态分配的内存区域的指针,它的类型是void*
。 -
delete
操作符是一个关键字,用于释放使用new
或new[]
分配的对象或数组的内存,它的参数是一个指向对象或数组的指针。
-