| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> 动态内存管理 -> 正文阅读 |
|
[C++知识库]动态内存管理 |
目录 ? 为什么存在动态内存分配我们现在已知开辟空间的方法有两种:
这两种开辟空间的方法有两个特点: 1.空间开辟大小是固定的 2.数组在申请的时候,必须指定数组的长度,它所需要的内存在编译时分配。 但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知道,那数组的编译时开辟空间的方式就不能满足了。 这时就要用到动态内存开辟了。 动态内存函数的介绍malloc通过MSDN,我们先对malloc进行简单的了解 malloc返回值的翻译 ?malloc returns a void pointer to the allocated space, or NULL if there is insufficient memory available. To return a pointer to a type other than void, use a type cast on the return value. The storage space pointed to by the return value is guaranteed to be suitably aligned for storage of any type of object. If size is 0, malloc allocates a zero-length item in the heap and returns a valid pointer to that item. Always check the return from malloc, even if the amount of memory requested is small. malloc返回一个指向已分配空间的void指针,如果可用内存不足,则返回NULL。若要返回指向非void类型的指针,请对返回值进行类型转换。返回值所指向的存储空间保证对任何类型的对象进行适当的对齐。如果size为0,malloc会在堆中分配一个长度为0的项,并返回一个指向该项的有效指针。总是检查malloc的返回值,即使请求的内存量很小。 free?注:free只能释放你通过动态内存函数开辟出来的空间,非动态开辟的内存空间是无法进行free。 这两个函数讲完,我们就可以写简单的代码:
calloc?calloc返回值相关说明的翻译: ?calloc returns a pointer to the allocated space. The storage space pointed to by the return value is guaranteed to be suitably aligned for storage of any type of object. To get a pointer to a type other than void, use a type cast on the return value. ?返回一个指向已分配空间的指针。返回值所指向的存储空间保证对任何类型的对象进行适当的对齐。要获得一个指向非void类型的指针,请在返回值上使用类型转换。
?realloc?realloc返回值相关信息的翻译: realloc returns a void pointer to the reallocated (and possibly moved) memory block. The return value is NULL if the size is zero and the buffer argument is not NULL, or if there is not enough available memory to expand the block to the given size. In the first case, the original block is freed. In the second, the original block is unchanged. The return value points to a storage space that is guaranteed to be suitably aligned for storage of any type of object. To get a pointer to a type other than void, use a type cast on the return value. Realloc返回一个指向重新分配(可能移动)内存块的void指针。如果大小为0且缓冲区参数不是NULL,或者没有足够的可用内存来将块扩展到给定的大小,则返回值为NULL。在第一种情况下,原始块被释放。在第二种情况下,原始块没有改变。返回值指向一个存储空间,该存储空间保证对任何类型的对象进行适当的对齐。要获得一个指向非void类型的指针,请在返回值上使用类型转换。
常见的动态内存错误1.对NULL指针的解引用操作
2.对动态开辟空间的越界访问
3.对非动态开辟内存使用free释放
4.使用free释放一块动态开辟内存的一部分
5.对同一块动态内存多次释放
动态开辟内存忘记释放(内存泄漏) 错误示范:
正确:
几道经典笔试题1.
这段代码的结果是崩溃。 一共有两处错误: 第一处就是没有进行free释放自己申请的空间。 第二处就是函数使用了传值调用,而不是传址调用,在CSDN里学习函数的时候,提到了函数的传参方式有两种,传值调用相当于是对传过去的变量的一份临时拷贝,而传址调用才能真正意义上改变这个变量。在这里,p只是一个和str相同类型的指针,p指向一个字节大小为100的空间,但却和str没有关系。所以strcpy这个函数就会出错,没有足够的空间,就无法拷贝"hello world",当然也不能复制啦。 2.
这个代码的输出结果是 ?这个代码有一处错误: 在Getmemory这个函数中,p是一个储存字符串"hello world"的字符串数组,返回p的值,p这个数组就会销毁,所有的用来创建GetMemory函数的空间都被收回,str指针虽然指向那个字符数组,但却没有访问的权限,故无法打印。 3.
这个代码输出的结果是 ?这个代码输出的结果和预想的一样,但仍存在一个和前面两个题一样的错误就是申请的空间没有进行释放。 柔性数组柔性数组:结构体中的最后一个元素允许是未知大小的数组,这就叫做”柔性数组”成员。 比如:
特点: 1. 结构体中柔性数组成员前面必须至少一个其他成员。 2. sizeof返回的这种结构体大小不包括柔性数组的内存 3.包含柔性数组成员的结构体用realloc()函数进行内存的动态分配,并且分配的内存应该大于·结构的大小,以适应柔性数组的预期大小。 柔性数组的使用 方法一:
方法二:
第一个方法的优点:方便内存释放(只需要进行一次释放) 第二个方法的优点:有利于访问速度。 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 6:35:35- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |