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?
这本身并不是一个错误。泄漏的程序仍然有效。这可能不是问题。但这仍然很糟糕;随着时间的推移,您的程序将从主机保留内存并且永远不会释放它。如果在程序完成之前主机的内存已满,则会遇到麻烦。
\n\n根据标准,这是未定义的行为。std::abort()实际上,这几乎总是由 C++ 运行时调用。
还有未定义的行为。但在某些情况下,不会发生什么不好的事情。您将测试您的程序,并将其投入生产。总有一天,它会无缘无故地坏掉。而且它会很硬:随机地。返工 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.\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
742 次 |
| 最近记录: |