zoukankan      html  css  js  c++  java
  • C++内存未释放的情况

     以下例子中,存储了整数123的记亿体空间不能被删除,因为地址丢失了。这些空间已无法再使用。

     1 #include <iostream>
     2 using namespace std;
     3 int main()
     4 { 
     5    int *a = new int(123);
     6    cout << *a << endl;
     7    // We should write "delete a;" here
     8    a = new int(456);
     9    cout << *a << endl;
    10    delete a;
    11    return 0;
    12 }
    View Code
    int* p=new int;
    p=new int;   //p指针修改,原来申请内存的地址没有记录下来,于是无法释放
     1 void MyFunction(int nSize)
     2 {
     3  char* p= new char[nSize];
     4  if( !GetStringFrom( p, nSize ) ){
     5   MessageBox(“Error”);
     6   return;
     7  }
     8  …//using the string pointed by p;
     9  delete p;
    10 }
    View Code

    下面是一个C语言的例子,在函数f()中申请了内存却没有释放,导致内存泄漏。当程序不停地重复调用这个有问题的函数f,申请内存函数malloc()最后会在程序没有更多可用存储器可以申请时产生错误(函数输出为NULL)。但是,由于函数malloc()输出的结果没有加以出错处理,因此程序会不停地尝试申请存储器,并且在系统有新的空闲内存时,被该程序占用。注意,malloc()返回NULL的原因不一定是因为前述的没有更多可用存储器可以申请,也可能是逻辑地址空间耗尽,在Linux环境上测试的时候后者更容易发生。

     1  #include <stdio.h>
     2  #include <stdlib.h>
     3  
     4  void f(void)
     5  {
     6      void* s;
     7      s = malloc(50); /* 申请内存空间 */
     8      return;  /* 内在泄漏 - 参见以下资料 */ 
     9      /* 
    10       * s 指向新分配的堆空间。
    11       * 当此函数返回,离开局部变量s的作用域后将无法得知s的值,
    12       * 分配的内存空间不能被释放。
    13       *
    14       * 如要「修复」这个问题,必须想办法释放分配的堆空间,
    15       * 也可以用alloca(3)代替malloc(3)。
    16       * (注意:alloca(3)既不是ANSI函数也不是POSIX函数)
    17       */
    18  }
    19  int main(void)
    20  {
    21      /* 该函数是一个死循环函数 */
    22      while (true) f(); /* Malloc函数迟早会由于内存泄漏而返回NULL*/
    23      return 0;
    24  }
    View Code

     

  • 相关阅读:
    mysql低版本升级到5.7
    mysql权限管理
    本地代码推送到远程git仓库
    解决ie低版本不认识html5标签
    使用ssh远程访问github
    centos7使用kubeadm搭建kubernetes集群
    js es6深入应用系列(Generator)
    js console一些常用的功能
    重新整理.net core 计1400篇[五] (.net core 修改为Startup模式 )
    重新整理.net core 计1400篇[五] (.net core 添加mvc 中间件 )
  • 原文地址:https://www.cnblogs.com/yhlx125/p/3856166.html
Copyright © 2011-2022 走看看