欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

浅谈new/delete

程序员文章站 2022-07-14 18:25:42
...

在C语言的学习中,我用知道动态内存开辟是使用malloc函数来进行开辟一段连续的空间,释放则是用free来进行释放,而学习了C我们知道,在C中开辟内存是使用new,释放则也与之对应的delete,下面我们就来说说malloc/free与new/delete之间的区别以及底层实现原理

回顾

在C语言库中函数原型如下

#include <stdlib.h>
void *malloc(size_t size);
void free(void *ptr);

malloc/free使用

int *p = (int*)malloc(sizeof(int));     //指向整型的指针p指向一个大小为100字节的内存的地址
if(p == NULL)                           //使用之前一定要判断释放申请成功
{
    printf("application memory error");
}
free(p);    //释放

与之还以两个函数

void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);
void *reallocarray(void *ptr, size_t nmemb, size_t size);

calloc 函数和malloc的区别就是申请好空间会初始化成0,另外calloc函数在使用时需要传入元素个数和元素字节大小

recalloc函数用于修改一个原先已经分配好的内存块的大小,可以使一块内存扩大或缩小,如果扩大内存,则原来的内存块保持不变,在内存尾部增加新的内存块,且不进行初始化。如果缩小内存,则原来内存块从尾部进行删减。如果原先的内存块无法扩充,则新开辟一块内存,并复制原先的内存的内容,原先内存块失效无法再进行访问。

new/delete使用

int *p = new int;   //在*存储区中分配创建了一个整形对象,并返回一个指向该对象的地址来初始化指针p
int *p = new int(); //对指针p指向的地址的值进行了初始化为0
int *P = new int(1024);//初始化为1024

当动态创建的对象用完后必须释放内存,避免造成内存泄漏,可以用delete来完成,new和delete是成对使用的,如下命令释放p指向的int型对象所占用的内存空间:

delete p
p = NULL;

C++中允许动态创建const对象

const int  *p=new const int(1024);  //动态创建的const对象必须进行初始化,并且进行初始化后的值不能再改变。

new[]/delete[]使用

当创建一个动态数组对象和进行内存释放时,执行以下语句:

int *p=new int[];               //指针p所指向的数组未初始化
int *p=new int[n];             //指针p指向长度为n的数组,未初始化
int *p=new int[]();            //指针p所指向的地址初始化为0
delete [] p;                   //回收p所指向的数组

它们之间的区别

new/delete原理

new[]/delete[]原理

相关标签: memory