显然,维基百科上有关于这个主题的大量信息,但我想确保我理解得正确。从我所了解的来看,了解堆栈关系才能真正理解内存泄漏的重要性?
因此,这是我(所认为)了解的内容,欢迎指出错误!
在程序启动时,一块内存被分配,比如0x000到0xFFF。第一部分(比如0x000到0x011)是代码/文本段,用于加载程序代码。
+--------------+ 0x011
| Program Code |
+--------------+ 0x000
然后你有一个栈(假设是0x012到0x7ff),它保存局部变量,并以先进先出的方式存储/检索它们。所以,如果你有类似于
char middleLetter(string word){
int len = word.length();
return word[len/2];
}
int main(){
int cool_number;
char letter;
letter = middleLetter("Words");
...
那么你的变量将在堆栈上分配,它会像这样:
+-------------+ 0x7ff
| |
| |
| |
| ... |
| len |
| letter |
| cool_number |
+-------------+ 0x012
当然,如果您在某个地方分配了内存(使用malloc
或new
),但从未释放它,则您的堆可能会出现这样的情况,并且现在您有一个内存泄漏:
+-------------+ 0xfff
| |
| malloc(20) | 0xf64
| malloc(50) | 0xf32
| malloc(50) | 0xf00
| ... |
| |
+-------------+ 0x800
这意味着虽然你可以通过指针算术直接访问0xf32,但操作系统/你的程序认为内存位置0xf00-0xf46已经被占用,并且不会再次将这些位置用于存储,直到你的程序关闭并释放内存。但是共享内存呢?维基百科称它不会被释放(直到计算机重新启动?)。那么如何知道它是共享内存呢?
这是一个相当不错的基本理解吗?我有没有漏掉或搞错什么?感谢您的关注!