C/C++_动态内存分配
内存分配
静态分配
编译时分配或内存的静态分配:命名变量的内存由编译器分配。在编译时必须知道确切的大小和存储,对于数组声明,大小必须是恒定的。
动态分配
运行时分配或动态分配内存:在运行时分配内存,在程序运行中动态分配内存空间,内存段称为堆或自由存储。在这种情况下,编译器不必事先知道项目的确切空间或编号。在这种情况下,指针起着重要作用。
可以在程序运行时动态分配存储空间,但不能"动态"创建新的变量名称,因此,动态分配需要两个条件:
-
在内存中创建动态空间
-
将其地址存储在指针中(从而可以访问空间)
静态内存分配和动态内存分配的比较
C++ 程序中的内存分为两个部分:
- **栈:**在函数内部声明的所有变量都将占用栈内存。
- **堆:**这是程序中未使用的内存,在程序运行时可用于动态分配内存。
静态内存是由系统自动分配,由系统自动释放的; 静态内存是在栈分配的。
动态内存是由程序员手动分配,手动释放的;动态内存是在堆分配的。
C动态内存分配
C语言使用了一个库解决方案实现动态内存分配,其函数malloc( ),calloc( ),realloc( )和free( )在
void *malloc(size_t size)
- size − 内存块的大小,以字节为单位。
分配请求的内存并返回指向该内存的指针。
void *calloc(size_t nitems, size_t size)
- nitems − 要分配的元素数。
- size − 元素的大小。
malloc 和 calloc 的不同之处在于,malloc 不会将内存设置为零,而 calloc 会将分配的内存设置为零。
void *realloc(void *ptr, size_t size)
- ptr − 指向先前使用malloc,calloc或realloc分配的内存块的指针,以进行重新分配。如果是 NULL,则分配一个新块,并且函数将返回指向该块的指针。
- size − 内存块的新大小,以字节为单位。如果为 0 并且 ptr 指向现有内存块,则 ptr 所指向的内存块将解除分配,并返回 NULL 指针。
void free(void *ptr)
- ptr − 指向先前分配了 malloc、calloc 或 realloc 以解除分配的内存块的指针。如果空指针作为参数传递,则不会发生任何操作。
示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main () {
char *str;
/* Initial memory allocation */
str = (char *) malloc(15);
strcpy(str, "tutorialspoint");
printf("String = %s, Address = %u\n", str, str);
/* Reallocating memory */
str = (char *) realloc(str, 25);
strcat(str, ".com");
printf("String = %s, Address = %u\n", str, str);
/* Deallocate allocated memory */
free(str);
return(0);
}
输出:
String = tutorialspoint, Address = 355090448
String = tutorialspoint.com, Address = 355090448
C++动态内存分配
new 和 delete 运算符
new data-type;
例如:
int * p; // declares a pointer p
p = new int; // dynamically allocate an int for loading the address in p
double * d; // declares a pointer d
d = new double; // dynamically allocate a double and loading the address in p
C 中的 malloc() 函数在C++中仍然存在,但建议避免使用 malloc( )函数。
因为容易出错(X
因为new 不仅分配内存,它还构造对象 (√
当不再需要动态分配的变量时,可以使用 delete 运算符来释放内存空间。(对应free( ))
delete var_name;
简单示例:
#include <iostream>
using namespace std;
int main()
{
double* val = NULL;
val = new double;
*val = 38184.26;
cout << "Value is : " << *val << endl;
delete val;
}
数组动态内存分配
char* val = NULL; // Pointer initialized with NULL value
val = new char[40]; // Request memory for the variable
delete [] val; // Delete the array pointed to by val
构造函数动态内存分配
#include <iostream>
using namespace std;
class stud {
public:
stud()
{
cout << "Constructor Used" << endl;
}
~stud()
{
cout << "Destructor Used" << endl;
}
};
int main()
{
stud* S = new stud[6];
delete[] S;
}