c/c++语言开发共享C C ++中内存泄漏的原因

C C ++中内存泄漏的原因是什么(除了通常分配内存而忘记解除分配内存)

    如果在分配和释放之间引发exception,则会发生内存泄漏。

    void f1() { int* ptr = new int; // do something which may throw an exception // we never get here if an exception is thrown delete ptr; } 

    每次f1以exception终止时,都会泄漏4个字节(假设int是4个字节)。

    分配内存,尚未取消分配内存时会导致内存泄漏,并且您将永远无法解除分配,因为您无法再访问它

    例如,以下代码导致大小sizeof(int)的内存泄漏:

     int * a = malloc(sizeof(int)); //allocate memory a = 0; //this will cause a memory leak 

    这会造成内存泄漏,因为现在我们永远无法释放为a分配的内存。

    如果不释放某些其他资源(如不在FILE *或其他库句柄上调用fclose),也可能会泄漏内存,因为它们可以分配程序无法直接访问的内存缓冲区。

    假设您创建了一个inheritance了其他没有虚析构函数的类的类。 如果指向这个类的指针的类型不是最派生的类(这通常发生在你使用抽象工厂时),那么只会调用指针类型中的析构函数,并且你所希望的任何东西都是派生的。类析构函数会泄漏。

    这是一个非常常见的错误,有时很难看到。

    无论如何,如果你想用C ++避免内存泄漏,请遵循以下规则:

    没有deletenew[]没有delete[]new[] delete[] ,没有freemalloc

    说真的,你还想听到什么?

    除了你提到的那个之外,没有其他原因导致内存泄漏

    我很惊讶没有人提到内存腐败。

    我记得有一个案例,当我们有一个粗略的固定大小的块内存分配器实现为链表。

    有些人搞乱了大小计算,导致复制数据只比最大块大小多几个字节(指针当时只有2个字节长:))。 然后它将覆盖位于下一个空闲块开始处的“下一个”链接,其中垃圾恰好用零填充。

    这导致了切断自由块链的后果。 从那时起,其他软件保留了他们自己指向他们使用的任何块的指针,程序似乎运行得很好。

    但当然,这个名单偶尔会出现几个街区,这次泄漏最终耗尽了免费区块,使应用程序挨饿。

    以伪代码编写的以下示例旨在显示内存泄漏如何产生及其影响,而无需任何编程知识。 在这种情况下,程序是一些非常简单的软件的一部分,旨在控制电梯。 只要电梯内的任何人按下楼层按钮,程序的这一部分就会运行。

    按下按钮时:

      Get some memory, which will be used to remember the floor number Put the floor number into the memory Are we already on the target floor? If so, we have nothing to do: finished Otherwise: Wait until the lift is idle Go to the required floor Release the memory we used to remember the floor number 

    如果要求的楼层数与电梯所在的楼层相同,则会发生内存泄漏; 释放内存的条件将被跳过。 每次出现这种情况时,都会泄漏更多内存。

      以上就是c/c++开发分享C C ++中内存泄漏的原因相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/560652.html

      (0)
      上一篇 2021年1月28日
      下一篇 2021年1月28日

      精彩推荐