精华内容
下载资源
问答
  • 当我执行重载减法操作符时,我创建了一个局部对象temp2,又为temp2的p指针new了一个动态数组,我想在析构时应该会把该temp2的p指针new出来的空间释放,但是为什么会报错,难道我二次释放了吗?问题出在星号部分。...
  • 这时首先想到一个问题,指针是一个变量,在函数结束时其作用域和生存期就结束了(根据内存的进程布局,函数的形参和局部变量,都存储于栈中,当函数结束时,会自动销毁这些变量),那么指针指向的内存也会被释放吗?...

    今天写服务器程序时,需要在dir_list_handler函数中返回struct resp_dir_list结构体指针。

    这时首先想到一个问题,指针是一个变量,在函数结束时其作用域和生存期就结束了(根据进程的内存布局,函数的形参和局部变量,都存储于栈中,当函数结束时,会自动销毁这些变量),那么指针指向的内存也会被释放吗?

    不会。一方面,指针是局部变量,存储于栈中,而其指向的内存不是局部变量,因此不会被释放。另一方面,指针变量一般用malloc初始化,其分配的内存位于堆中,而非栈中,只有使用free才会释放内存。

    下面是测试程序。

    #include <stdio.h>
    #include <stdlib.h>
    int * func(void)
    {
    	int *a = (int *)malloc(sizeof(int));//如果不用malloc初始化指针,会有段错误,想想为什么。因为a会乱指,所以指针必须初始化,要么赋值NULL,要么用malloc
    	*a = 666;
    	//free(a);
    	return a;
    }
    void main()
    {
    	int *b = func();
    	printf("*b is %d\n",*b);
    }
    
    以上函数输出:*b is 666

    展开全文
  • 函数中的局部变量在内存中如何申请 C++的多态,及怎么实现,用例子说明 多态、继承、多态怎么实现(手写) C++内部实现机制 用过什么指针 C11特性了解吗 mat申请一个图像矩阵后怎么释放内存 set map低层实现...

     目录

    C++

    Python

    算法导论

    Linux

    其他

    编程问题


    C++

    1. static
    2. 结构体占多少字节
    3. 函数中的局部变量在内存中如何申请
    4. C++的多态,及怎么实现,用例子说明
    5. 多态、继承、多态怎么实现(手写)
    6. C++内部实现机制
    7. 用过什么指针
    8. C11特性了解吗
    9. mat申请一个图像矩阵后怎么释放内存
    10. set map低层实现的数据结构是什么
    11. map,m[1]=“str”;这句低层是怎么实现的,发生了什么
    12. STL中vector的低层实现
    13. STL中插入的操作时间复杂度,要考虑内存复制扩充,
    14. C11特性有了解吗
    15. STL用过哪些,低层实现
    16. set、map的查找复杂度、插入删除等
    17. 手写vector实现
    18. STL中vector的resize函数、reserve函数
    19. 引用和指针的区别https://blog.csdn.net/smartgps2008/article/details/90648015
    20. C++中内存管理
    21. 堆和栈的访问哪个更快
    22. 内存中堆和栈的区别 (https://blog.csdn.net/qq894040717/article/details/82320658)
    23. C为什么比C++快?
    24. const(https://www.cnblogs.com/lixuwu/p/9452457.html)

     

    Python

    1. python传参会改变原值吗
    2. 多线程多进程
    3. python多进程 多线程,为什么多线程比较鸡肋
    4. 线程和进程 区别
    5. 那进程间可以通信啊,什么方式
    6. 线程可以通信吗?
    7. 线程有哪些状态
    8. 你了解多线程、多进程吗?有写过吗
    9. python中怎么实现多线程、多进程的?
    10. python中的多线程是真的多线程吗?
    11. python是解释语言还是编译语言
    12. xrange与range的区别
    13. 迭代器,啥来着,忘了
    14. STL中vector的低层实现
    15. STL中插入的操作时间复杂度,要考虑内存复制扩充,

     

    算法导论

    1. 动态规划和分治的区别与联系,各自适应哪些情况
    2. 如何求二叉树的深度
    3. 图的遍历方式
    4. 广度优先可以用来求二叉树的深度吗
    5. 深度优先算法

     

    Linux

    1. 那你知道grep命令吗?(商汤、360 )
    2. Linux基本命令
    3. 那你了解shell吗?
    4. sed 命令

     

     

    其他

    1. mysql都有哪些操作
    2. 了解过hadoop吗?MapReduce呢?
    3. hql
    4. hbase、kafka、kafka producer、深度为5的3阶B树
    5. hbase 集群 regionServer宕机后,hbase自身恢复流程。

     

     

    编程问题

    1. 最大连续子数组
    2. 数组有序,但是循环右移了几位,问新数组中原数组起始位子的下标是多少
    3. 给数组,找到加起来是100的一组数
    4. 一篇英文文章,统计单词频率,得到频率最高的那个单词
    5. 给一组整数,无序,在不改动原数组的基础上,请找出1000个位置连续的数,使其和为10万
    6. 那如果是不限制个数,只要使其和为10万就可以的数。
    7. 给10x10的棋盘,扫雷,随机放置10个点作为雷,如何保证随机放置
    8. 数组n个正整数,每个数值不超过n-1,有一个重复的数,找出那个重复的数
    9. n位字符串,循环右移m位,要求时间复杂度线性,空间复杂度为o(n)
    10. 两个图像库,场景一一对应,一个有雨滴,一个没有雨滴,对有雨滴的图像去除雨滴,要不留痕迹。
    11. 写一个函数,只有一条语句,判断数n是不是2的幂
    12. 筛子六个面,每个面的概率不一样,要求实现一个掷筛子的函数
    13. 54张牌,分3组,大王小王同在一组的概率
    14. 代码:实现卷积操作
    15. 代码问题:手写直方图
    16. 撕代码:iou计算、k-means
    17. iou和NMS怎么算,写代码
    18. 反向传播求导,给了个例子链式求导,pool如何反向传播(虹软貌似很偏爱梯度求导的问题)
    19. LR(逻辑回归)手写代码
    20. 最长回文子串
    21. 代码:归并排序
    22. STL用过哪些
    23. 反转链表
    24. 求期望:设随机变量X1,X2,…Xn相互独立,且都服从(0,θ)上的均匀分布。求U=max{X1,X2,…Xn}数学期望
    25. 反转字符串
    26. 有一个数target,一个数组,数组中两个数的和是这个target,请找到这两个数
    27. 一个1-n的数,少了一个,找出来
    28. 1-n,少了两个数,找出来
    29. 计算1-100的质数和
    30. 如何实现一个栈,支持动态扩充 (头条)
      如何用链表实现一个栈,
      如何实现一个栈,O(1)获取最小值,get_min
      如何节省空间,存放最小值,如果有多个,不想多次存放
      用map计数,但是需要O(logN)的复杂度查找;用数组计数,空间复杂度更大用数组计数,空间复杂度更大;设置结构体,除了value,还有一个count值,计数。即前面已经用了链表,节点结构体含有,value,count,next;
    31. 手写快排(非常重要,经常问到)
    32. 手写:给数字N,表示以后N对括号,求所有可能的合法括号
    33. 判断括号是否合法
    34. shell
    35. 查看文件大小命令
    36. 查看文件多少行命令
    37. 如何后台起一个服务
    38. 写个代码:字符串转数字
    39. LR,给你数据,进行性别分类,有:身高、体重、兴趣,注意有些特征连续,有些是离散的,怎么用LR来做。特征维度是多少维度
    40. 编程:强盗抢东西那个题,优化了3次
    41. 字符串的全排列
    42. 快速找到一个数字的开五次方根
    43. 一个数,0-1024,最多几次找到这个数
    44. 52张牌,摸5张牌,求顺子的概率,,允许不同花色
    45. 二维矩阵,行、列皆有序,用O(M+N)查找一个数是否存在
    46. 给定一个单链表,一个数x,然后你把这个单链表改成前面是比x小,后面是大于等于x的顺序,然后每个部分仍然保持原来链表的顺序。
    47. 一道推理题:三个连续数,大于6,其中两个是质数,问第三个一定能被6整除。
    48. 写一个二叉树非递归的中序遍历
    49. 查询表A中有但表B中没有的?
    50. 两个表做连接

     参考:【计算机视觉算法岗面经】“吐血”整理:2019秋招面经 https://blog.csdn.net/liuxiao214/article/details/83043197

    展开全文
  • 这里需要提醒基础不好的同学,第九行,*p打印出p的值对应的存储单元的数据;如果是p,则打印p的值(是个地址,指针变量存放的值是个地址)。这个值每次打印都不一样。2.栈    栈是用来存放局部...

    1、堆

    在内存的全局存储空间中,用于程序动态分配和释放的内存块称为自由存储空间,通常也称之为堆。

    在C程序中,我们用malloc和free函数来从堆中动态地分配和释放内存。

    图片

    图片

    这里需要提醒基础不好的同学,

    图片

    第九行,*p打印出p的值对应的存储单元的数据;

    如果是p,则打印p的值(是个地址,指针变量存放的值是个地址)。

    图片

    图片

    这个值每次打印都不一样。

    图片

    2.栈

    栈是用来存放局部变量、函数的参数以及调用函数和被调用函数的联系的内存池。它是一种先进后出的压入弹出式的数据结构。栈内存由编译器在需要的时候自动分配,在不需要的时候自动销毁的变量。

    3.free函数的重要性

    静态内存的数量在编译时是固定的,在程序运行期间也不会改变。自动变量使用的内存数量在程序执行期间自动增加或减少。但是动态分配的内存数量只会增加,除非用 free()进行释放。内存不进行释放,会造成内存泄漏,甚至可能会导致系统崩溃。

    free函数的用处在于实时地执行回收内存的操作,如果程序很简单,程序结束之前也不会使用过多的内存,不会降低系统的性能,那么也可以不用写free函数去释放内存。程序结束之后,操作系统会完成释放功能。

    但是在开发大型程序时如果不写free函数去释放内存,后果是很严重的。如果程序要重复10000次10MB的内存分配,如果每次用完都释放,那程序只需要10MB就行了,但是如果不适用free函数释放,那么程序就要使用100G内存。这其中包括绝大部分的虚拟内存,而由于虚拟内存的操作需要读写磁盘,这会极大地影响系统性能,系统可能因此崩溃。

    总结

    存储类别和动态内存分配有何联系?我们来看一个理想化模型。可以认为程序把它可用的内存分为3部分:一部分供具有外部链接、内部链接和无链接的静态变量(static)使用;一部分供自动变量使用;一部分供动态内存分配。

    静态存储类别所用的内存数量在编译时确定,只要程序还在运行,就可访问储存在该部分的数据。该类别的变量在程序开始执行时被创建,在程序结束时被销毁。

    然而,自动存储类别的变量在程序进入变量定义所在块时存在,在程序离开块时消失。因此,随着程序调用函数和函数结束,自动变量所用的内存数量也相应地增加和减少。这部分的内存通常作为栈来处理,这意味着新创建的变量按顺序加入内存,然后以相反的顺序销毁。

    动态分配的内存在调用 malloc()或相关函数时存在,在调用 free()后释放。这部分的内存由程序员管理,而不是一套规则。所以内存块可以在一个函数中创建,在另一个函数中销毁。正是因为这样,这部分的内存用于动态内存分配会支离破碎。也就是说,未使用的内存块分散在已使用的内存块之间。另外,使用动态内存通常比使用栈内存慢。总而言之,程序把静态对象、自动对象和动态分配的对象储存在不同的区域。

    本期的内容结束~主要介绍了存储类别、内存管理。

    如果发现文中有错误,欢迎到后台留言,感谢~

    欢迎大家提出一切宝贵的建议~❤

    最后厚着脸皮跟大家要个订阅~❤

    展开全文
  • C++实用经验(五)

    2020-06-28 16:30:51
    C++实用经验(五)禁止函数返回局部变量的引用函数传值、传指针和传引用的效率分析效率分析内联函数会像宏一样替换吗函数重载需要考虑什么不要让main返回void如何降低函数的圈复杂度 声明:以下内容总结自《C++...


    声明:以下内容总结自《C++程序员不可不知的101条实用经验》

    禁止函数返回局部变量的引用

    函数被调用时的操作:编译器首先把函数的输入/输出参数放到堆栈,指令寄存器IP放到堆栈(作为函数返回出口地址),然后是基址寄存器,接着是函数的局部变量。当函数返回时执行弹出操作,顺序正好和放到堆栈的顺序相反(首先释放堆栈中的局部存储变量,然后时基址寄存器、IP寄存器地址和函数的输入/输出参数),同时把放到堆栈的IP寄存器地址作为函数的出口地址并退出函数。

    当函数内部的局部变量在堆栈上的内存被操作系统收回,则返回的局部变量具体变成什么就无法确定了。

    解决方法:在函数内使用new生成对象,返回对象的指针或引用。
    缺点:(1)函数内部申请了内存,但不负责释放内存,容易造成内存泄漏,增加用户使用负担。
    (2)内存申请和释放不在一个模块中,影响模块的完整性和单一性,破坏函数内聚性。
    (3)如果编写的程序作为一个库的形式提供给别人调用,别人不知道你在函数中申请了内存而不去释放内存。违反了谁创建,谁释放的原则。

    函数传值、传指针和传引用的效率分析

    传值:(1)在拷贝传值时,如果数据类型为类,函数会调用类的拷贝构造函数。
    (2)在堆栈释放副本时,如果数据类型为类,函数会调用类的析构函数。

    传引用:(1)堆栈上放的是引用的地址,在函数内通过自动的间接寻址找到引用内容。
    (2)在副本创建和释放时不会发生构造和析构函数调用。

    传指针:(1)指针是地址,传递时不会调用类的构造函数。
    (2)指针的解引用就是间接寻址,获得指针变量中内存地址处的数据。

    效率分析

    (1)从执行效率(在被调用的函数体内执行时的效率)上说,传值调用时,对值的读写都是通过直接寻址的方式执行的,而指针和大多数情况下的引用是以间接寻址的方式执行,所以执行效率会低。如果对参数读写操作比较频繁,则传值比传指针、传引用的执行效率更高。
    (2)从整个函数的执行角度考虑,传值调用时的值占用内存空间大,则拷贝需要较大的开销,造成效率低下。
    (3)传值调用时,如果值的形参是父类,而实参是子类,则值传递时临时对象构造只会构造父类的部分,不会构造子类的任何特有部分。
    (4)值传递比指针传递要安全,因为你不可能传一个不存在的值给传值参数或引用参数,而指针可能传一个不存在的地址。所以值传递和引用传递比指针传递要安全,使得代码更加健壮。

    内联函数会像宏一样替换吗

    内联函数是真正的函数,具备宏的效果,会像宏一样展开,使得调用内联函数时不用进行跳转,减小普通函数执行时保存现场和恢复现场时的开销,提高函数执行效率。
    在类中直接定义成员函数,则成员函数为内联函数,称为隐式内联。
    在类外单独定义成员函数,并在函数名前加上inline关键字,称为显式内联。
    在这里插入图片描述
    建议用内联函数替换宏。

    在这里插入图片描述
    在这里插入图片描述

    函数重载需要考虑什么

    函数重载:在同一作用域内可以有一组具有相同函数名、不同参数列表的函数。
    在这里插入图片描述
    重载的同名函数经过编译之后名称就变了,全局重载函数名称变化机制映射关系为:作用域+返回类型+函数名+参数列表
    在这里插入图片描述

    不要让main返回void

    main函数的返回值说明程序的退出状态。返回0代表main函数成功执行完毕,程序正常退出,否则代表程序异常退出。

    void main()这种形式的main函数不符合C++标准,不应该这样写。只用两种main函数定义方式是合法和正确的:
    int main(void); int main(int argc, char *argv[]);

    如果main函数执行结束时没有return语句,编译器会默认隐式地为程序添加return 0
    注意点:(1)main函数返回类型必须为int (2)main最后加上return 0

    如何降低函数的圈复杂度

    圈复杂度:衡量一个模块判断结构的复杂程度,数量上表现为独立现行路径的条数,即合理地预防错误所需测试的最少路径条数。

    圈复杂度高说明代码质量低且难以测试维护。

    在这里插入图片描述
    降低圈复杂度的9种技术(https://www.jianshu.com/p/c2e1e304cab2):
    (1)提炼函数。把堆在一起的代码构建成模块化的函数。
    (2)替换算法。
    (3)分节条件表达式。
    (4)合并条件式。
    (5)合并重复的条件片段。
    (6)移除控制标记。
    (7)将查询函数和修改函数分离。
    (8)令函数携带参数。
    (9)以明确的函数取代参数。

    展开全文
  • 可我找不到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此往复,以到无穷。 41 数组大小 42 1.23 能否声明和传入数组大小一致的局部数组,或者由其他...
  • 可我找不到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此往复,以到无穷。 41 数组大小 42 1.23 能否声明和传入数组大小一致的局部数组,或者由其他...
  • 当我 malloc() 为一个函数的局部指针分配内存时, 我还需要用 free() 明确的释放吗? . . . . . . . . . . . . . . . . . . . . . . . . 39 7.20 我在分配一些结构, 它们包含指向其它动态分配的对象的指针。 我在释放...
  • 可我找不到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此往复,以至无穷。  数组大小  1.23 能否声明和传入数组大小一致的局部数组,或者由其他参数...
  • 可我找不到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此往复,以至无穷。 数组大小 1.23 能否声明和传入数组大小一致的局部数组,或者由其他参数...
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    可我找不到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此往复,以至无穷。 数组大小 1.23 能否声明和传入数组大小一致的局部数组,或者由其他参数...
  • 可我找不到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此往复,以至无穷。 12  数组大小 13 1.23 能否声明和传入数组大小一致的局部数组,或者由...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    可我找不到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此往复,以至无穷。 12  数组大小 13 1.23 能否声明和传入数组大小一致的局部数组,或者由...
  • C学习深入学习总结

    2017-11-03 16:59:17
    7.3 动态申请内存一定要释放,否则会内存泄露。你是否使用过内存检测工具? 10 8 字符串 10 8.1 strlen()函数的返回值是什么类型的? 10 8.2 字符串strlen() 的值,是否和他占据的内存空间相同? 10 8.3 你是否知道...
  • o 7.12 我如何声明大小和传入的数组一样的局部数组 ? o 7.13 我该如何动态分配多维数组 ? o 7.14 有个灵巧的窍门: 如果我这样写 int realarray[10]; int *array = &realarray[-1]; 我就可以把 ``array" 当作...
  • 如题,在准备面试的时候发现好多...照理说char *p作为局部变量在函数结束后就会被释放,但是申请到的stelen(Src)+1字节的内存不会被释放掉呀,但是为什么直接操作dst来赋值得到的效果就像是dst指针释放掉了一样?
  • C语言编程要点

    2017-09-18 00:10:37
    7.22. 两次释放一个指针会导致什么结果? 124 7.23. NULL和NUL有什么不同? 125 7.24. 为什么不能给空指针赋值?什么是总线错误、内存错误和内存信息转储? 126 7.25. 怎样确定一块已分配的内存的大小? 126 7.26. free()...
  • 7.22 两次释放一个指针会导致什么结果? 7.23 NULL和NUL有什么不同? 7.24 为什么不能给空指针赋值?什么是总线错误、内存错误和内存信息转储? 7.25 怎样确定一块已分配的内存的大小? 7.26 free()函数是怎样...
  • 零起点学通C++多媒体范例教学代码

    热门讨论 2010-11-30 09:35:13
    1.3 学习c++之前需要先学C吗 1.4 c++与其他语言的区别 1.5 c++的版本以及安装问题 第2章 做一个最简短的C4-+程序 2.1 简单的屏幕输出小程序 2.2 输出语句的使用 2.3 std::介绍 2.4 iostream与iostream.h的区别 ...
  • 1.3 学习c++之前需要先学C吗 1.4 c++与其他语言的区别 1.5 c++的版本以及安装问题 第2章 做一个最简短的C4-+程序 2.1 简单的屏幕输出小程序 2.2 输出语句的使用 2.3 std::介绍 2.4 iostream与iostream.h的...
  • 1.3 学习c++之前需要先学c吗 3 1.4 c++与其他语言的区别 3 1.5 c++的版本以及安装问题 3 第2章 做一个最简短的c++程序 4 2.1 简单的屏幕输出小程序 4 2.2 输出语句的使用 5 2.3 std::介绍 6 2.4 iostream与...
  • 你必须知道的495个C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    4.5 我能否用void** 指针作为参数, 使函数按引用接受一般指针? . . 18 4.6 我有一个函数extern int f(int *); 它接受指向int 型的指针。我怎 样用引用方式传入一个常数?下面这样的调用f(&5); 似乎不行。. 18 4.7 C...
  • 操作系统(内存管理)

    热门讨论 2009-09-20 12:55:25
    free:该函数获得指向由 malloc 分配的内存片段的指针,并将其释放,以便以后的程序或操作系统使用(实际上,一些 malloc 实现只能将内存归还给程序,而无法将内存归还给操作系统)。 物理内存和虚拟内存 要理解...
  • free:该函数获得指向由 malloc 分配的内存片段的指针,并将其释放,以便以后的程序或操作系统使用(实际上,一些 malloc 实现只能将内存归还给程序,而无法将内存归还给操作系统)。 物理内存和虚拟内存 要...
  • 面试题209 基类中有一个虚函数,子类还需要申明为virtual吗 面试题210 C++的类有什么优点 面试题211 如何实现多态?父类和子类的继承关系如何 面试题212 为什么要引入抽象基类和纯虚函数(摩托罗拉笔试 题) 面试题...
  • C++程序员面试宝典

    热门讨论 2013-04-01 13:36:19
    面试题52 局部变量与嵌套的作用域 52 面试题53 变量有哪几种存储类型 53 4.4 引用 53 面试题54 什么是引用 54 面试题55 如何使用const引用与非const引用 54 4.5 C与C++的联系 55 面试题56 C与C++有什么区别 55 4.6 ...

空空如也

空空如也

1 2 3
收藏数 42
精华内容 16
关键字:

局部指针需要释放吗