首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我必须在指针上使用free而不是正常的声明?

在C语言中,使用free()函数是为了释放动态分配的内存。当你使用malloc()calloc()realloc()等函数分配内存时,你需要在不再需要这些内存时使用free()函数来释放它们。这是因为动态分配的内存需要手动管理,而不是自动回收。

使用free()函数的原因是它能确保内存被正确释放,并且在释放内存之前,会检查内存是否有效。这有助于防止内存泄漏和未定义行为。

例如,如果你有一个指针ptr,你可以使用以下代码释放它指向的内存:

代码语言:c
复制
free(ptr);

这将确保内存被正确释放,并且在释放内存之前,会检查内存是否有效。

如果你不使用free()函数,那么内存将不会被释放,这可能会导致内存泄漏和未定义行为。

总之,使用free()函数是为了确保内存被正确释放,并且在释放内存之前,会检查内存是否有效。这有助于防止内存泄漏和未定义行为。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么应该使用指针不是对象本身

问题 之前一直使用 Java,现在开始转向 C++。...发现使用 C++ 的人经常用指针表示对象,比如像下面这样: Object *myObject = new Object; 不是, Object myObject; 或者在调用成员函数时候,都会这样...: myObject->testFunc(); 不是, myObject.testFunc(); 有点想不明白为什么这么做?...意思是说你想一直使用某个地址位置变量,不是副本,对于后者,我们更应该使用 Object myObject; 语法。 你需要很多内存。 大家都知道,栈空间比堆空间小多。...切片意思就是说:在函数传参处理多态变量时,如果一个派生类对象在向上转换(upcast),用是传值方式,不是指针和引用,那么,这个派生类对象在 upcast 以后,将会被 slice 成基类对象,

1.4K10

为什么在 Linux 使用 exa 不是 ls?

我们生活在一个繁忙世界里,当我们需要查找文件和数据时,使用 ls 命令可以节省时间和精力。但如果不经过大量调整,默认 ls 输出并不十分舒心。...当有一个 exa 替代方案时,为什么要花时间眯着眼睛看黑白文字呢? exa 是一个常规 ls 命令现代替代品,它让生活变得更轻松。这个工具是用 Rust 编写,该语言以并行性和安全性闻名。...跟踪文件 你可以使用 exa 来跟踪某个 Git 仓库中新增文件。 image.png 树形结构 这是 exa 基本树形结构。--level 值决定了列表深度,这里设置为 2。...image.png 递归 当你想递归当前目录下所有目录列表时,exa 能进行递归。 image.png 相信 `exa 是最简单、最容易适应工具之一。...它颜色编码让更容易在多个子目录中进行搜索,它还能帮助我了解当前 xattrs。

2K40
  • 如何定位Obj-C野指针随机Crash(一):先提高野指针Crash率

    当然也有相当多Obj-C野指针不是这种表现,所以野指针Crash体量非常惊人。 为什么Obj-C野指针Crash那么多?...本文说Obj-C野指针,说是Obj-C对象释放之后指针未置空,导致指针(Obj-C里面一般不会出现为初始化对象常识性错误)。 既然是访问已经释放对象为什么不是现Crash呢?...因为dealloc执行后只是告诉系统,这片内存不用了,系统并没有就让这片内存不能访问。...NSObjectdealloc、runtime object_dispose,Cfree应该都是可以,但是各有优点,选择是覆盖面最广freefree是C函数,重写了它之后还可以顺带解决一部分...3、如果释放后访问野指针是系统代码,虽然提前发现了Crash,但是离解决问题还是很远。 4、如果野指针指向数据没有被当成指针使用,还是可能不立即Crash。 欲知后续问题如何解决,请听下回分解。

    5.7K84

    开发成长之路(3)-- C语言从入门到开发(讲明白指针和引用,链表很难吗?)

    栗子来一颗: int a; int &at = a; //上述声明允许将at和a互换,它们指向相同值和内存单元,就像连体婴一样。 上面这个栗子其实很有内涵在里面 为什么不写成下面这个形式呢?...int a; int &at; at = a; 在指针中是可以,但是&不允许,&必须在声明时将其初始化。 引用经常被用作函数参数,使得函数中变量名成为调用程序中变量别名。...//如果理解不了,这样理解:参数中*和&只是走个过场,告诉人家那个参数是什么类型 //调用函数时参数是a,不是*a,也不是&a //所以&a传这个a是一个int类型,*a这个a就是指针...通过传递引用不是整个数据对象,可以提高程序运行速度。 指针 指针和const 将const用于指针有一些很微妙地方。 可以用两种不同方式将const关键字用于指针。...函数指针 关于为什么使用函数指针理解还不是很深刻,毕竟功力不足。但是知道那些回调函数都是用函数指针,所以对函数指针必须要理解好。 这叫啥,“但行好事,莫问为啥”。

    58020

    万字长文【C++】高质量编程指南

    2,头文件中只存放声明不存放定义,注意:C++语法中,类成员函数可以再声明同时被定义,并且自动成为内联函数,这虽然会带来书写上方便,但却造成了风格不一致,建议将成员函数定义与声明分开,不论该函数体有多么小...(2)free或delete释放了内存之后,没有将指针设置为NULL,导致产生了 野指针 8.2.3.指针与数组对比 数组要么在静态存储区被创建,如全局数组,要么在栈被创建。...*),不是p所指内存容量 //当数组作为函数参数进行传递时,该数组自动退化为同类型指针 void Func(char a[100]) { sizeof(a);//4 不是100 } 8.2.4...辨识重载:靠参数不是返回值不同来区分重载函数,编译器根据参数为每个重载函数产生不同内部标识符号。 extern "C"用处 如果C++程序要调用已经被编译后C函数,?...,因为类声明是唯一构造函数可以有多个,因此会有不同次序初始化表。

    1.5K20

    《看聊天记录都学不会C语言?太菜了吧》(6)编程很难吗?差一点就学不会了呢!

    为什么你不早说!——(懂!题解)求素数 《看聊天记录都学不会C语言?太菜了吧》(21)(懂!题解冒泡排序)在现实生活中,打擂台比赛争名次竟用是冒泡排序?——(懂!...题解)冒泡懂 《看聊天记录都学不会C语言?太菜了吧》(20)(懂!题解指定天数)能知道2000年后这个月一共有几天——(懂!...小C:使用float就可以表示小数了,不过在C语言里我们应该叫做浮点数。 小媛:那是不是这样就等于创建了一个浮点数变量了。...小媛:啊,为什么会这样。 小C:那是因为%d表示也是整数,我们不应该使用%d,而是使用%f。你换成这样试试。...☺️ 小C:是的,但是记住,程序是从上往下运行,就跟你看书一样,要使用一个变量你必须在之前就需要声明创建,不然我们编译器不知道这是啥东西。

    33630

    如何定位Obj-C野指针随机Crash(二):让非现Crash变成

    一篇如何定位Obj-C野指针随机Crash介绍了思路后,这次我们继续看,如何让非现Crash变为现。 ?...另外,本文探讨环境是在非arc情况下。 只有小概率Crash肿么办? 之前介绍了一种在内存释放后填充0x55使野指针后数据不能访问,从而使某些野指针从不必现Crash变成了现。...这个时候系统随时可能把这片内存给别的代码使用,也就是说我们0x55被再次写上随机数据(在这里再强调一下,访问野指针是不会Crash,只有野指针指向地址被写上了有问题数据才会引发Crash)。...假如释放内存又填上了另一个对象指针,而那个对象也有同样一个方法,那很可能只是逻辑上有问题,并不会直接Crash,甚至悄无声息地像什么事情都没发生一样。...继续提高Crash率 沿着上次思路,首先,我们要解决问题就是怎么让系统不再往这片释放内存乱放东西。 要控制底层内存管理机制让它不使用这些内存可能很困难。

    3.9K44

    【c++】类和对象(二)this指针

    ,也就是说,d1和d2调用是同一个函数,那当d1调用 Init 函数时,该函数是如何知道应该设置d1对象,不是设置d2对象呢 首先思考,这里打印函数,访问变量是哪里?...private: int _year; int _month; int _day; 并不是,因为这里只是声明,并没有开辟空间,真正访问是实例化d1,d2 在private部分声明变量_year...在函数内部可以使用 1.3思考题 一,this指针是存在哪里?...然而,取地址操作&i表明i必须在内存中有实际存储位置,所以它很可能位于栈,除非进行了特殊优化 int j = 1; j是一个非const局部变量,存储在栈。...指针p本身(即存储字符串地址变量)作为局部变量,存储在栈 i(取决于编译器优化)和j存储在栈。 字符串常量"abcdefg"存储在常量区。 指针p(存储字符串常量地址)存储在栈

    9810

    一道华为C语言面试题,很多人都栽了!

    看到这里,你应该明白了,这是一道非常典型悬空指针问题。注意,不是有些人认为指针,野指针是定义指针变量未曾初始化赋值。悬空指针才是上面这种,已经释放后,但又没有及时将其置为NULL。...答案是printf时候崩溃了,我们可以用WinDbg调试器来调试运行,发现strcpy运行并没有报错,成功把字符串完成了复制: 通过查看崩溃时候调用堆栈,实际是崩溃在了printf函数内部调用链条...这里所谓free,仅仅是告诉C语言运行时库,这块内存不用了,你回收回去统一管理吧。 所以,当调用strcpy时候,是能够正常复制。 但要注意,这块内存能写,不代表你能乱写。...另外,这段代码在Linux默认编译后,也是能够运行: 所以总结来看,这段代码能不能正常工作,没有一个确定说法,与不同平台、不同编译模式都有关系,它运行结果是不确定。...但好玩来了,接下来还是打印p,不是打印q,居然把指针q内容给我打印出来了。 打印了两次p,两次输出内容居然不一样,这是为什么呢?

    13210

    面试中常见 C 语言与 C++ 区别的问题

    不同点如下: malloc、free是标准库函数,new、delete则是运算符。malloc、free在C、C++中都可使用new、delete只属于C++。...new、delete返回是某种数据类型指针,malloc、free返回是void指针。 注意:malloc申请内存空间要用free释放,new申请内存空间要用delete释放,不能混用。...因为两者实现机理不同。 C++引用和C指针有何区别 分析问题:引用就是变量或对象别名,它不是值,不占据存储空间,其只有声明没有定义。在C++中引用主要用于函数形参和函数返回值。...在函数中使用指针所指对象数值时,必须在指针前加上,如上例中swap函数频繁使用了“a”、“*b”,如此不仅书写麻烦,还不利于阅读,并且容易产生错误。...注意:引用作为函数参数时,会引发一定问题,因为让引用作为参数,目的就是想改变这个引用所指向地址内容,函数调用时传入是实参,看不出函数参数是正常变量,还是引用,因此可能会引发错误。

    91451

    易错、经典问题:return不可返回指向栈内存指针

    那是因为GetStr函数返回指向栈内存指针,这里变量p是局部变量,局部变量是分配在栈。...可以看到能正常输出。为什么这里又可以正常输出呢?因为这里p虽然分配在栈,但是此时Hello是一个字符串常量,其存储在静态存储区。在调用GetStr函数结束时其也不会被销毁。...这里可能有些人会有疑惑,同样是Hello,为什么一个在栈,一个在静态区。 char *p = "Hello"; 此处首先定义了一个指针变量p,编译器就会为指针变量开辟了栈空间。...相关笔记:【C语言笔记】char *str与char str[]区别 其它替代方法 从上面的例子我们知道,若函数返回指向栈内存指针,所得到结果并不是我们想要。...但是这样会导致函数是不可重入。关于函数重入与不可重入可查看往期笔记。 2、在GetStr函数中使用malloc申请动态内存,但使用完一定要记得使用free进行释放,否则会导致内存泄漏。

    1.3K20

    程序员C语言快速上手——高级篇(十)

    动态内存 内存分配在堆上,用完需手动释放,使用指针来引用分配内存,作用域局限于引用内存指针 为什么需要在堆上面分配动态内存?...例如将数组声明为全局数组变量,那么就必须在声明时静态指定数组长度。假如我们用一个数组来存放会员注册信息,那么我们根本不能在编译时确定数组具体长度,显然,我们需要一个可以动态增长内存区域。...可以看到,该函数之所以如此复杂,其目的就是为了保证申请空间都是一片连续内存空间,不是碎片化内存。...失败时,它不会对原来堆空间造成影响 关于free使用总结当使用free函数释放内存后,指向原堆空间指针并不会被清理或重置,这意味着指向原空间指针中仍保存着一个不合法地址,如果不小心再次使用了这个指针...首先思考一个问题,指针仅仅是用来保存一个内存地址,所有的内存地址都只是一个号码,那么指针为什么还需要类型呢?理论所有的指针都应该是同一种类型才对呀?

    1.4K30

    面试中常见C语言与C++区别的问题

    不同点如下: malloc、free是标准库函数,new、delete则是运算符。malloc、free在C、C++中都可使用new、delete只属于C++。...new、delete返回是某种数据类型指针,malloc、free返回是void指针。 注意:malloc申请内存空间要用free释放,new申请内存空间要用delete释放,不能混用。...因为两者实现机理不同。 C++引用和C指针有何区别 分析问题:引用就是变量或对象别名,它不是值,不占据存储空间,其只有声明没有定义。在C++中引用主要用于函数形参和函数返回值。...在函数中使用指针所指对象数值时,必须在指针前加上*,如上例中swap函数频繁使用了“*a”、“*b”,如此不仅书写麻烦,还不利于阅读,并且容易产生错误。...指针间赋值 引用赋值如下: int a=1,b=2; int &v1=a, &v2=b; 这时执行r1= r2;改变是v1,将r 2指向对象值赋值给v1,不是引用r1本身。

    1.1K30

    初级程序员面试不靠谱指南(一)

    “来到这英雄宴中的人物,就算本身武功不是甚高,见识也广博,“太祖拳法”精要所在,可说无人不知。乔峰一招打出,人人都是情不自禁喝了一声采!...虽然在C++中有时候会用#define声明一个常量,但是这二者还是有略微不同,比如如果用const声明常量会进行类型检查,#define只是简单替换。...通俗一点,可以使用*ic_pointer=1修改其指向值,可以使用*ci_pointer=&j,修改其指向变量,反之,则会出现编译错误。为什么会出现这样情况呢?...,但是你不能通过*ci_pointer修改值,因为从声明看它认为自己是指向const int,所以它所接到命令是不改掉指向值。     ...,你必须在fiel1.cpp中使用如下语句extern const int i=2;为什么会这样呢?

    87990

    【熟视C语言】C语言动态内存管理(malloc,calloc,realloc,free

    为什么需要使用动态内存 对于初学者来说,最先接触到内存使用便是以下场景: // int val = 3;//为变量val在栈区申请一块空间存储数据 char str[] = "abc";//为数组str...动态内存函数 (函数声明在头文件stdlib.h中) malloc和free malloc是C语言提供一个开辟动态内存函数。...标准对参数ptr指向空间不是动态开辟这个行为并没有做出规定。 如果接收到ptr是NULL指针,函数不会进行任何操作。...free(array); array = NULL; return 0; } 动态内存函数常见使用错误 由于动态内存函数地使用涉及指针,内存空间知识,对于C语言这块内容还不是很熟悉的人来说使用难度较大...,而是会在free时候检测出来并报错 //此时会报出类似堆区异常访问,或者在访问正常数据后空间之类错误 } (代码运行截图) 使用free释放非动态开辟内存空间 void test3()

    18310

    记64位地址截断引发挂死问题

    那么为什么要切64位呢?原因也很简单,32位寻址范围有限,能使用最大内存也是非常有限,因此需要使其能够支持64位,这个过程需要修改编译工程,编译第三方库为64位,修改代码等等。...这个问题很明显,因为申请内存得到地址值与释放内存地址不是同一个,因此导致coredump(coredump查看可参考《linux常用命令-开发调试篇》中gdb部分)。 为什么地址值被截断?...正因如此,就有了第二个警告,提示从整型转换成指针。 到此其实也就真相大白了。既然testFun返回值被编译器默认为int,返回一个8字节指针类型,返回值却是int,自然就会被截断了。...32位程序为什么正常?相信你已经有了答案。 总结 由于对出现问题程序代码不熟悉,加上其编译工程充斥着大量警告没有处理,以及涉及动态库,导致这个引起挂死问题罪魁祸首没有提前暴露处出来。...*指针格外小心 思考 为什么32位时候运行正常64位程序会挂死 32位和64位程序用户空间地址范围分别是多少 如何在调试中设置程序源码路径 程序完整编译经历那几个阶段

    87420

    面试总结-C++

    为什么不能建立引用数组 将引用作为函数参数时,可以避免对变量或者对象复制,因此不会调用对象拷贝构造函数。当不希望传入引用参数不被改变时,使用const引用。...- 数组名不是真正意义指针,可以理解为常指针,所以数组名没有自增、自减等操作。...- 指针free或delete之后没有及时置空 => 释放操作后立即置空。 ##### 指针和数组区别 数组要么在静态存储区被创建(如全局数组),要么在栈被创建。...用运算符sizeof 可以计算出数组容量(字节数)。sizeof(p),p 为指针得到是一个指针变量字节数,不是p 所指内存容量。...在Linux中以.so结尾 当静态库和动态库同名时, gcc命令将优先使用动态库.为了确保使用是静态库, 编译时可以加上 -static 选项,因此多第三方程序为了确保在没有相应动态库时运行正常,喜欢在编译最后应用程序时加入

    2.1K11

    深入浅出C指针,细节之处见真章,拒绝一切无病呻吟!!!

    文章目录 前言 认识指针为什么要熟练指针? 难度指数:1颗星 / 细节指数:3颗星 / 重要指数:3颗星 指针一定要在声明时初始化?...C++安排上了,但是指针想先安排一下。 前面写过一篇指针,反响还不错,但是个人感觉还是欠缺火候。于是,又闭关三天,拿出这一篇来。 ---- 认识指针为什么要熟练指针?...为什么要谈指针色变呢? ---- 指针一定要在声明时初始化? 难度指数:1颗星 / 细节指数:2颗星 / 重要指数:3颗星 无稽之谈。也不知道为什么有的人会这么说,是不是从某本书上看来啊。...星号将变量声明指针,星号其实是一个重载符号,因为它也用在乘法和解引指针。...顾名思义,就是在函数里面声明并分配内存指针。 这种指针以及它分配到内存,作用域属于这个函数,一旦函数结束,它理论是没有了。

    29720

    如何定位Obj-C野指针随机Crash(三):如何让Crash自报家门

    我们在前文(第一部分、第二部分)里曾经介绍过在内存释放后填充0x55使野指针出现后数据不能访问,从而使野指针变成了方法,那这里会有一个比较奇怪问题:我们在释放内存填上了0x55,但为什么大部分时候野指针...怎么获取野指针更多异常数据? 弄清楚上述问题后,又有一个问题:既然0x55555555是被当成了类指针使用,那假如我们用指定类覆盖这个指针,是不是就可以执行我们指定类方法呢?...free之前先填上 0x55 ,这个0x55有什么具体含义吗? 答:实际填写数据关键在于填写数据后其地址指向不可读内存。...填写0x55,和前面提到出现异常情况对象地址0x555555连接起来被当成指针使用的话,就会被识别为0x55555555,CPU访问这个地址就会抛出异常。...另外一点,就是方便区分野指针,例如在Xcode启用Enable Scribble时,指定alloc之后填写地址为0xaa,防止内存初始化就使用,也是为了方便和free之后内存做区分。

    6.1K52

    如何定位Obj-C野指针随机Crash(三):加点黑科技让Crash自报家门

    我们在前文里曾经介绍过在内存释放后填充0x55使野指针出现后数据不能访问,从而使野指针变成了方法,那这里会有一个比较奇怪问题:我们在释放内存填上了0x55,但为什么大部分时候野指针Crash...怎么获取野指针更多异常数据? 弄清楚上述问题后,又有一个问题:既然0x55555555是被当成了类指针使用,那假如我们用指定类覆盖这个指针,是不是就可以执行我们指定类方法呢?...free之前先填上 0x55 ,这个0x55有什么具体含义吗? 答:实际填写数据关键在于填写数据后其地址指向不可读内存。...填写0x55,和前面提到出现异常情况对象地址0x555555连接起来被当成指针使用的话,就会被识别为0x55555555,CPU访问这个地址就会抛出异常。...另外一点,就是方便区分野指针,例如在Xcode启用Enable Scribble时,指定alloc之后填写地址为0xaa,防止内存初始化就使用,也是为了方便和free之后内存做区分。

    94830
    领券