21xrx.com
2024-12-22 22:50:29 Sunday
登录
文章检索 我的文章 写文章
C++标准库中的内存分配函数
2023-06-26 20:58:58 深夜i     --     --
C++ 标准库 内存分配函数 malloc calloc realloc

在C++编程中,内存分配是一个非常重要的环节。C++标准库中提供了许多内存分配函数,其中最常用的是new和delete操作符。除此之外,C++标准库中还有其他的一些内存分配函数,如malloc、calloc、realloc等。

1. new操作符

new操作符可用于动态地分配内存,同时返回一个指向分配内存的地址。与C语言中的malloc函数相似,new也可以分配一定数量的内存。C++中的new操作符还有一个特点,就是可以自动调用构造函数。当new动态分配了一个对象时,自动调用对应对象的构造函数。另外,new操作符分配内存时,如果内存不足则会抛出bad_alloc异常。

示例代码:


int *ptr = new int; //动态分配内存,分配一个整型变量的内存空间

int *ptrArr = new int[10]; //分配10个整型变量的内存空间

class Test {

public:

 Test() cout << "Test Constructor!" << endl;

 ~Test() cout << "Test Destructor!" << endl;

};

Test *ptrTest = new Test; //动态分配一个对象

Test *ptrTestArr = new Test[10]; //分配10个对象

2. delete操作符

delete操作符用于释放使用new分配的内存。使用时需要指定要释放的内存指针,就可以将其释放并回收内存。如果释放一个本来没有使用new分配内存的指针,那么会造成未定义的行为。

示例代码:


delete ptr; //释放ptr指向的内存空间

delete[] ptrArr; //释放ptrArr指向的内存空间,注意使用delete[]释放动态数组

delete ptrTest; //释放动态分配的对象

delete[] ptrTestArr; //释放动态分配的对象数组

3. malloc函数

malloc函数是C语言中的内存分配函数,但在C++中同样适用。malloc函数返回一个指向分配内存的地址的指针。需要注意的是,malloc函数只负责分配内存,并不会调用构造函数,因此使用malloc分配的内存空间需要手动初始化。

示例代码:


int *ptr = (int *)malloc(sizeof(int)); //动态分配一个整型变量的内存空间

//分配一个整型数组的内存空间,并初始化

int *ptrArr = (int *)malloc(sizeof(int) * 10);

for (int i = 0; i < 10; i++) {

  ptrArr[i] = i;

}

//分配一个对象的内存空间

Test *ptrTest = (Test *)malloc(sizeof(Test));

ptrTest = new (ptrTest) Test(); //手动调用构造函数进行初始化,注意使用placement new语法

4. calloc函数

calloc函数也是C语言中的内存分配函数,在C++中同样适用。calloc函数与malloc函数的区别在于,它会将分配的内存空间初始化为0。需要注意的是,calloc函数同样不会调用构造函数。

示例代码:


//分配一个整型数组的内存空间,并初始化为0

int *ptrArr = (int *)calloc(10, sizeof(int));

//分配一个对象数组的内存空间,并初始化为0

Test *ptrTestArr = (Test *)calloc(10, sizeof(Test));

5. realloc函数

realloc函数可用于重新调整已经分配的内存空间的大小。该函数接受一个已经分配的内存地址和所需要的新空间大小作为参数,并返回一个指向新分配内存的地址的指针。需要注意的是,realloc函数在重新分配内存空间时可能会导致已经存在的数据丢失。

示例代码:


//分配初始内存空间

int *ptrArr = (int *)malloc(sizeof(int) * 10);

for (int i = 0; i < 10; i++) {

  ptrArr[i] = i; //初始化

}

//重新调整内存空间大小为20

ptrArr = (int *)realloc(ptrArr, sizeof(int) * 20);

综上所述,C++标准库中提供了许多内存分配函数,在实际的编程过程中需要根据具体的使用场景选择合适的函数。同时,需要注意在使用这些函数时,必须避免内存泄漏和指针悬挂等问题。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复