如何在C++中创建内存泄漏?

Bal*_*i C 20 c++ memory-leaks

我只是想知道如何使用C++创建系统内存泄漏.我已经对此进行了一些谷歌搜索,但没有多少提出来,我知道在C#中实现它并不是真的可行,因为它是托管代码但是想知道是否有一种简单的方法可以用C++做到这一点?我只是觉得有趣的是看到系统因为代码编写不当而遭受多少损失.谢谢.

Ton*_*ion 26

  1. 创建指向对象的指针并将其分配到堆上
  2. 不要删除它.
  3. 重复上一步
  4. ????
  5. 利润

  • 创建一个指针是不够的。它必须指向堆分配的对象(即使如此,指针也不是很重要) (2认同)

Sta*_*ked 26

当您稍后调用new而不调用相应的内容时,会发生内存泄漏delete.如下面的示例代码所示:

int main() {
    // OK
    int * p = new int;
    delete p; 

    // Memory leak
    int * q = new int;
    // no delete
}
Run Code Online (Sandbox Code Playgroud)

  • 如果它是一个无限循环,那么它将泄漏"无限"的内存量(直到系统挂起或强行杀死进程). (3认同)

Pup*_*ppy 14

int main() {
    while(true) new int;
}
Run Code Online (Sandbox Code Playgroud)

  • @sehe:问题是如何在C++中创建泄漏 - 为什么有人会在C#中回答? (3认同)
  • @Luchian:作为布尔条件的指针分配?这一点都不简单或清楚。 (2认同)
  • @DeadMG 我们应该在设计内存泄漏时清楚吗?:D 另外,这很简单…… new int 返回一个指针,该指针可以计算为布尔值…… (2认同)

Dav*_*men 7

内存泄漏有很多种:

  • 分配的内存是无法释放的,因为没有任何内容指向它.
    在C和C++中很容易创建这种泄漏.它们也很容易预防,易于检测,易于治愈.因为它们易于检测,所以有许多工具,免费和商业,以帮助找到这种泄漏.

  • 仍然可以访问的分配内存应该很久以前就已经发布了.
    这些类型的泄漏更难以检测,预防或治愈.还有一些东西指向它,它最终会被释放- 例如,就在之前exit().从技术上讲,这不是一个泄漏,但出于所有实际目的,这是一个泄漏.许多据称无泄漏的应用程序都有这样的泄漏.您所要做的就是运行系统配置文件,以查看一些愚蠢的应用程序消耗更多的内存.即使在托管语言中,这些类型的泄漏也很容易创建.

  • 首先应该永远不会分配的分配内存.
    示例:用户可以轻松地要求Matlab创建这些类型的泄漏.Matlab在创建这类泄漏方面也非常积极.当Matlab从中获取失败时,malloc它会进入一个等待一段时间然后重试的循环malloc.同时,操作系统疯狂地尝试通过将程序块从实内存中移入虚拟内存来处理内存丢失.最终一切都在虚拟内存中 - 一切都悄然停滞.