首页 > 其他分享 >c语言的delete函数

c语言的delete函数

时间:2023-06-19 18:12:04浏览次数:35  
标签:malloc 语言 int void 指针 new delete 函数

很多学过C的人对malloc都不是很了解,知道使用malloc要加头文件,知道malloc是分配一块连续的内存,知道和free函数是一起用的。一部分人还是将:malloc当作系统所提供的或者是C的关键字,事实上:malloc只是C标准库中提供的一个普通函数

1,关于malloc以及相关的几个函数

#include (Linux下)

void *malloc(size_t size);

void free(void *ptr);

void *calloc(size_t nmemb, size_t size);

void *realloc(void *ptr, size_t size);

也可以这样认为(window下)原型:extern void *malloc(unsigned int num_bytes);

头文件:#include 或者#include 两者的内容是完全一样的。

如果分配成功:则返回指向被分配内存空间的指针

不然,返回空指针NULL。

同时,当内存不再使用的时候,应使用free()函数将内存块释放掉。

malloc分配的内存大小至少为size参数所指定的字节数

malloc的返回值是一个指针,指向一段可用内存的起始地址

多次调用malloc所分配的地址不能有重叠部分,除非某次malloc所分配的地址被释放掉

malloc应该尽快完成内存分配并返回(不能使用NP-hard的内存分配算法malloc和free函数是配对的,如果申请后不释放就是内存泄露;如果无故释放那就是什么都没有做,释放只能释放一次,如果释放两次及两次以上会出现错误(但是释放空指针例外,释放空指针其实也等于什么都没有做,所以,释放多少次都是可以的))

实现malloc时应同时实现内存大小调整和内存释放函数(realloc和free)

关于:void *,表示未确定类型的指针。C,C++规定,void *类型可以强转为任何其他类型的的指针。

关于void *的其他说法:

void * p1;

int *p2;

p1 = p2;                 就是说其他任意类型都可以直接赋值给它,无需进行强转,但是反过来不可以。

2,malloc和new

new返回指定类型的指针,并且可以自动计算所需要的大小。

int *p;

p = new int; //返回类型为int *类型,分配的大小为sizeof(int)

p = new int[100]; //返回类型为int *类型,分配的大小为sizeof(int) * 100

而malloc则必须由我们计算字节数,并且在返回的时候强转成实际指定类型的指针。

int *p;

p = (int *)malloc(sizeof(int));

1,malloc的返回是void *,如果我们写成了: p = malloc(sizeof(int));间接的说明了(将void *转化给了int *,这不合理)

2,malloc的实参是sizeof(int),用于指明一个整形数据需要的大小,如果我们写成:

p = (int *)malloc(1), 那么可以看出:只是申请了一个字节的空间,如果向里面存放了一个整数的话,

将会占用额外的3个字节,可能会改变原有内存空间中的数据

3,malloc只管分配内存,并不能对其进行初始化,所以得到的一片新内存中,其值将是随机的。一般意义上:我

们习惯性的将其初始化为NULL。 当然,也可以用memset函数的。

简单的说:

malloc 函数其实就是在内存中:找一片指定大小的空间,然后将这个空间的首地址给一个指针变量,这里的指针变量可以是一个单独的指针,也可以是一个数组的首地址, 这要看malloc函数中参数size的具体内容。我们这里malloc分配的内存空间在逻辑上是连续的,而在物理上可以不连续。我们作为程序员,关注的 是逻辑上的连续,其它的,操作系统会帮着我们处理的。

3、malloc,free和new,delete的区别

(1)malloc和new都是在堆上分配内存。栈区的内存分配是系统自动分配释放的,主要存放函数的参数值、局部变量的值等。

(2)Malloc和free在C程序中使用,而C++程序中使用new和delete,删除数组delete[]p,指针释放后,要将指针置空。

(3)New和delete可以调用构造函数和析构函数。

(4)Malloc是函数,new是关键字。

(5)Malloc不能赋初值,new可以,如int *p = new int(2).代表分配一个int型的内存空间,并赋初值2.如果new int ()代表赋初值0,new int[10]代表分配10个int.

(6)Malloc返回的指针是void *类型,而new返回的指针是它分配空间的类型。

C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。简单来说就是使用delete释放单个对象,使用delete[]释放数组对象。

关于 new[] 和 delete[],其中又分为两种情况:

为基本数据类型分配和回收空间;
为自定义类型分配和回收空间。
下面的代码分别用new, new[]分配自定义类型的空间、用delete, delete[]回收自定义类型的空间

#include <iostream>
using namespace std;
 
class T {
public:
  T() { cout << "constructor" << endl; }
  ~T() { cout << "destructor" << endl; }
};
 
int main()
{
  const int NUM = 3;
 
  T* p1 = new T[NUM];
  cout << hex << p1 << endl;
  //  delete[] p1;
  delete p1;
 
  T* p2 = new T[NUM];
  cout << p2 << endl;
  delete[] p2;
}

基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;但是对于类对象数组,只能用 delete[]。对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。

简单来说就是:new 配合 delete 使用,而new[] 配合 delete[]使用。

标签:malloc,语言,int,void,指针,new,delete,函数
From: https://www.cnblogs.com/lanlancky/p/17491831.html

相关文章

  • fread函数
    fread函数的原型是:size_tfread(void*ch,size_tmode,size_tnumber,FILE*fp)。第一个参数是数组的地址;第二个参数是数据类型的大小;第三个参数是需要读取多少个这样的数据类型;第四个参数是文件指针。该函数正常情况下返回的值是number,这表示读取了多少个数据。例子:doubleret[1......
  • main函数传参
    在有些C语言程序中,我们会看到main函数有如下的写法:intmain(intargc,char*argv[]);或者是这样的:intmain(intargc,char**argv);给main传参通过argc和argv这两个参数来实现。执行程序时,可以从命令行传值给C程序。这些值被称为命令行参数,它们对程序很重要,特别是当您想......
  • linux C语言 使用socket获取本机所有IP地址
    #include<stdio.h>#include<sys/ioctl.h>#include<net/if.h>#include<arpa/inet.h>/******************************************************函数功能:获取本机所有ip地址。*输入参数:*max_ip_num:ip_buf能存的最多ip个数;*输出参数:*ip_b......
  • 自学C语言 2023_6_19
    变量,常量:变量——能被改变的量常量——不能改变的量定义变量的方法:inta=150;floatb=45.5f;charc='w';变量   变量的分类:局部变量——在打括号内的变量为局部变量全局变量——在大括号外的是全局变量例:inta=100;intmain(){inta=10;printf("%d\n",a);ret......
  • Oracle列转行函数LISTAGG() WITHIN GROUP ()用法
    1:SELECTID,SIDFROMTestWHERE ID='001' 2:SELECTID,LISTAGG(SID,',')WITHINGROUP(ORDERBYSID)ASSID_LISTFROMTestWHERE ID='001'groupbyID  ......
  • R语言实战(第三版)全新升级版,超过30万学习者入手的畅销书
    在我刚入学那会儿初次接触R语言,看的第一本工具书就是《R语言实战》,收获良多,当时还只是第二版。最近和人民邮电出版社的好朋友交流发现,他告诉我上个月刚刚出版了《R语言实战第三版》,豆瓣评分9.2,被称为最牛R语言实战书升级版。上面这本书的第1版于2012年出版,距今已经过去1......
  • 子函数、子过程的可选参数
    参数的使用参数的使用对于过程和函数都是一样的。所以本节的内容对过程和函数都适用。参数可分为可选参数和必选参数两种。必选参数在调用(过程或函数时)必须加上,否则会报错。可选参数则可写可不写。默认是必选参数,可选参数在定义时用Optional关键字声明,并且可选参数必须放在参数......
  • ABAP READ_TEXT, SAVE_TEXT函数使用,物料,利润中心等长文本批量读取及维护
    一.READ_TEXT函数读取长文本本文以利润中心长文本读取及维护为例子,事务码:KE521.查看长文本参数,输入KE52事务码查看图片12.点击书写按钮后,输入需要维护的长文本语言。查看图片23.点击转到->表头,其中文本名,语言,ID和文本对象为调用函数需要的参数查看图片34.READ_T......
  • 基于ChatGPT函数调用来实现C#本地函数逻辑链式调用助力大模型落地
    6月13日OpenAI官网突然发布了重磅的ChatGPT更新,我相信大家都看到了,除了调用降本和增加更长的上下文版本外,开发者们最关心的应该还是新的函数调用能力。通过这项能力模型在需要的时候可以调用函数并生成对应的JSON对象作为输出。这使开发人员能更准确地从模型获取结......
  • 简单做了一个语言翻译的功能
    1//html部分2<template>3<divstyle="background-color:#F6F6F6;height:100vh;">4<header><van-iconname="arrow-left"class="iconreturn"@click="$router.go(-1)"/>{{$t('fu......