这里我如何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);
之后这个程序能正常工作我的意思是,为什么在释放后可以进行迭代?
当函数返回一些内存,而这些内存在另一个上下文中被释放时,我是否以这种方式正确工作?
您的程序显示出未定义的行为。简而言之,任何事情都可能发生,包括你的程序看起来工作正常。
malloc/free的实现通常不会在调用free
后立即将内存块返回到底层操作系统。这样做是出于性能原因。对malloc
的下一次调用可能会通过返回一个指向刚刚释放的块的指针并重新使用它来最有效地处理。此时,在代码中,会有两个指针指向同一内存块,谁知道接下来会发生什么。
请勿使用它!由于程序员依赖于一些被声明为未定义的行为,其他程序员稍后应该重现其他错误。
http://www.joelonsoftware.com/articles/fog0000000054.html
Windows 95?没问题。不错的新32位API,但它仍然完美地运行旧的16位软件。微软痴迷于此,花了大量的时间来测试他们在Windows95上找到的每一个旧程序。Jon Ross为Windows3.x编写了SimCity的原始版本,他告诉我,他不小心在SimCity中留下了一个错误,他读取了刚刚释放的内存。是的。它在Windows3.x上运行得很好,因为内存从来没有去任何地方。令人惊讶的是:在Windows95的测试版上,SimCity没有进行测试。微软追踪到了这个错误,并在Windows95中添加了寻找SimCity的特定代码。如果它发现SimCity正在运行,它会以一种特殊的模式运行内存分配器,这种模式不会立即释放内存。正是这种对向后兼容性的痴迷让人们愿意升级到Windows95。
从已释放的内存中读/写是未定义的行为。您的程序今天可能工作,明天可能崩溃;或者等到下一次满月再撞击。
它之所以能够工作,是因为堆管理器尚未将该内存分配给malloc()
的另一个调用方。并且free()
没有修改内存的现有内容,所以在调用free()
之前,您在这些位置写的内容仍然存在。但依赖这种行为会导致灾难。
这是未定义的行为。这看起来是可行的,但实际上任何事情都有可能发生。
它看起来工作的原因(可能)是,当您调用free
时,内存没有被清除,而是被标记为可由操作系统重新使用。
这显然是未定义的行为。
释放内存并不意味着清零。大多数时候,内存会简单地标记为"可用"。当你在释放后立即使用它时,它会静止那里完好无损。但如果出于某种原因需要更多的内存,它可能会被覆盖。