gpt4 book ai didi

memory-leaks - 什么是内存泄漏?

转载 作者:行者123 更新时间:2023-12-03 10:41:29 25 4
gpt4 key购买 nike

显然 Wikipedia有大量关于该主题的信息,但我想确保我理解。据我所知,了解堆栈/堆关系对真正了解内存泄漏很重要?

所以这就是我(认为)我理解的。非常欢迎更正!

首次启动程序时,会分配一块内存,例如 0x000 到 0xFFF。第一部分(比如 0x000 到 0x011)是加载程序代码的代码/文本段。

+--------------+ 0x011
| Program Code |
+--------------+ 0x000

然后你有保存局部变量的堆栈(比如 0x012 到 0x7ff),它们被存储/检索到 FIFO。所以如果你有类似的东西
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

当然,如果你在某处分配内存(使用 mallocnew ),但从未释放它,那么你的堆可能看起来像这样,你现在有内存泄漏:
+-------------+ 0xfff
| |
| malloc(20) | 0xf64
| malloc(50) | 0xf32
| malloc(50) | 0xf00
| ... |
| |
+-------------+ 0x800

这意味着虽然您可以使用指针算法直接访问 0xf32,但操作系统/您的程序认为内存位置 0xf00-0xf46 已经被占用,并且永远不会再次使用这些位置进行存储,直到您的程序关闭并且内存被释放。但是共享内存呢?维基百科说它永远不会被发布(直到你的电脑重新启动?)。你怎么知道它是否是共享内存?

这是一个很好的基本理解吗?我有什么遗漏/有错吗?感谢您的关注!

最佳答案

似乎您确实理解它 - 除了一个异常(exception):在您的示例中, len 与其他所有内容一样是一个堆栈变量。 newmalloc在堆上创建,其他所有内容(局部变量等)都在堆栈上。并且 main 的局部变量与任何其他函数的变量没有区别。

共享内存是一种相当罕见的情况,您通常不需要它,因此除非您明确要求,否则您不会拥有它(否则,某些随机的其他进程可能会使用您的进程使用的完全相同的内存 - 显然,这会把东西弄坏了)。

关于memory-leaks - 什么是内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3373854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com