内存泄漏、访问已释放的内存和双重释放之间有什么区别?

Cod*_*bit 3 c++ memory memory-leaks memory-management

我试图找出与内存模型相关的这三种问题之间的区别。

如果我想模拟一个memory leak场景,我可以创建一个指针,而不调用相应的删除方法。

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

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

如果我想模拟一个double free场景,我可以释放一个指针两次,这部分内存稍后将被分配两次。

a = malloc(10);     // 0xa04010
b = malloc(10);     // 0xa04030
c = malloc(10);     // 0xa04050

free(a);
free(b);  // To bypass "double free or corruption (fasttop)" check
free(a);  // Double Free !!

d = malloc(10);     // 0xa04010
e = malloc(10);     // 0xa04030
f = malloc(10);     // 0xa04010   - Same as 'd' !
Run Code Online (Sandbox Code Playgroud)

不过,我不知道是什么accessing freed memory。有人能给我举个例子吗accessing freed memory

YSC*_*YSC 5

    \n
  1. 内存泄漏是很糟糕的。
  2. \n
  3. 双重免费更糟糕。
  4. \n
  5. 访问已释放的内存情况更糟
  6. \n
\n\n

内存泄漏

\n\n

这本身并不是一个错误。泄漏的程序仍然有效。这可能不是问题。但这仍然很糟糕;随着时间的推移,您的程序将从主机保留内存并且永远不会释放它。如果在程序完成之前主机的内存已满,则会遇到麻烦。

\n\n

双重释放

\n\n

根据标准,这是未定义的行为。std::abort()实际上,这几乎总是由 C++ 运行时调用。

\n\n

访问已释放的内存

\n\n

还有未定义的行为。但在某些情况下,不会发生什么不好的事情。您将测试您的程序,并将其投入生产。总有一天,它会无缘无故地坏掉。而且它会很硬:随机地。返工 r\xc3\xa9sum\xc3\xa9 的最佳时机。

\n\n

以下是如何访问释放的内存:

\n\n
// dont do this at home\nint* n = new int{};\ndelete n;\nstd::cout << *n << "\\n"; // UNDEFINED BEHAVIOUR. DONT.\n
Run Code Online (Sandbox Code Playgroud)\n