• 内存泄露一个经典例子


    这个程序测试后会有什么结果?[美国某著名计算机嵌入式公司2005年9月面试题]

    解析:毛病出在函数GetMemory中。void GetMemory(char *p, int num)中的*p实际上是主
    函数中str的一个副本,编译器总是要为函数的每个参数制作临时副本。在本例中,p申请了
    新的内存,只是把p所指的内存地址改变了,但是str丝毫未变。因为函数GetMemory没有返
    回值,因此str并不指向p所申请的那段内存,所以函数GetMemory并不能输出任何东西,如
    下图所示。事实上,每执行一次GetMemory就会申请一块内存,但申请的内存却不能有效释
    放,结果是内存一直被独占,最终造成内存泄露。

    如果一定要用指针参数去申请内存,那么应该采用指向指针的指针,传str的地址给函数
    GetMemory。代码如下:

         这样的话,程序就可以运行成功。字符串是一个比较特殊的例子。我们分别打印*str、
    str、&str可以发现,结果分别是h、hello、0*22f7c。str就是字符串的值;*str是字符串中某一
    字符的值,默认的是首字符,所以是h;&str是字符串的地址值。
         由于“指向指针的指针”这个概念不容易理解,我们可以用函数返回值来传递动态内存。
    这种方法更加简单,代码如下:

    我们可以对这道题推而广之,看一下整型变量是如何传值的,代码如下:

    GetMemory2把v的地址传了进来,*z是地址里的值,是v的副本。通过直接修改地址里的
    值,不需要有返回值,也把v给修改了,因为v所指向地址的值发生了改变。
    答案:程序崩溃。因为GetMemory并不能传递动态内存,Test函数中的str一直都是
    NULL。

  • 相关阅读:
    Kafka的安装和设置
    Nginx的安装和设置
    Spark实现K-Means算法
    Spark GraphX实例(2)
    Scala字符串插值
    Scala的Class、Object和Apply()方法
    Spark GraphX实例(1)
    java.lang.ClassNotFoundException: SparkPi$$anonfun$1
    Intellij IDEA连接Spark集群
    Container [pid=6263,containerID=container_1494900155967_0001_02_000001] is running beyond virtual memory limits
  • 原文地址:https://www.cnblogs.com/yihujiu/p/6368077.html
Copyright © 2020-2023  润新知