malloc /免费。 可以读取释放的内存
我在这里怎么样malloc内存
char *convertToPostfix(char **infixExpr) { char *postfixExpr = (char *) malloc(strlen(*infixExpr) * sizeof(char) * 2); ... return postfixExpr; }
我在这里如何使用这个记忆:
char *subexpr = convertToPostfix(infixExpr); free(subexpr); while (*subexpr) postfixExpr[i++]=*subexpr++;
为什么这个程序在free(subexpr);
之后正常工作free(subexpr);
我的意思是为什么在释放后可以迭代?
我是否正确地以这种方式工作,当函数返回一些内存时,它会在另一个上下文中释放?
您的程序显示未定义的行为。 简而言之,任何事情都可能发生,包括您的程序似乎正常工作。
在您调用free
之后,malloc / free的实现不会立即将内存块返回到底层操作系统,这是很常见的。 这是出于性能原因而完成的。 通过返回指向您刚刚释放的块的指针并因此重新使用它,可以最有效地处理对malloc
的下一次调用。 此时,在您的代码中,将有两个指针指向同一块内存,谁知道接下来会发生什么。
不要使用它! 由于程序员依赖于一些声明为未定义的行为,其他程序员应该在以后重现其他错误。
http://www.joelonsoftware.com/articles/fog0000000054.html
Windows 95? 没问题。 不错的新32位API,但它仍然完美地运行旧的16位软件。 微软痴迷于这一点,花了很大一部分变化来测试他们在Windows 95中找到的每个旧程序。编写原始版本的SimCity for Windows 3.x的Jon Ross告诉我,他不小心在SimCity留下了一个bug读取他刚刚释放的记忆。 是的。 它在Windows 3.x上运行良好,因为内存永远不会去任何地方。 这是令人惊奇的部分:在Windows 95的beta版本中,SimCity没有进行测试。 微软追踪了这个漏洞并在Windows 95中添加了寻找SimCity的特定代码。 如果它发现SimCity正在运行,它将以特殊模式运行内存分配器,该模式不会立即释放内存。 这是对后向兼容性的一种迷恋,使人们愿意升级到Windows 95。
从已释放的内存中读取/写入是未定义的行为。 你的程序今天可以运行,明天会崩溃; 在崩溃之前等到下一个满月。
它似乎工作的原因是因为堆管理器尚未将该内存分配给另一个malloc()
调用方。 并且free()
没有修改内存的现有内容,所以无论你在调用free()
之前写入这些位置的是什么都在那里。 但依靠这种行为是一种灾难。
这是未定义的行为。 它似乎有效,但实际上任何事情都可能发生。
它似乎工作(可能)的原因是,当您调用free
,内存不会被清除,而是被操作系统标记为可重用。
这显然是未定义的行为。
释放内存并不意味着将其归零。 大多数情况下,内存将简单地标记为“可用”。 当你在释放后立即使用它时,它仍然完好无损。 但如果由于某种原因需要更多内存,它可能会被覆盖。