我在web和我的高级C类(如下面的代码)中看到了相当多的错误代码。虽然我知道这显然是一种糟糕的编码实践,但是除了浪费CPU周期之外,我很难理解它所做的事情。根据我到目前为止的理解,如果指针分配没有位于"malloc表“中(因为缺少更好的单词),它通常会被忽略。我希望这里的人能让我更好地理解为什么这是坏的,(除了这是一件愚蠢的事情)和它的后果。
char* ptr = malloc(1);
...
free(ptr);
...
free(ptr);发布于 2014-10-07 06:23:47
一个很好的建议:在空闲后取消指针。在您的情况下,您有未定义的行为,因为计算机可以分配内存,这是ptr指出的,或者可能没有分配这段内存,或者这块内存可以在碎片整理期间添加到其他内存块中,等等。
另一方面,空闲(NULL)是定义的,不会做任何事情。
char* ptr = malloc(1);
...
free(ptr);
ptr = NULL;
...
free(ptr);发布于 2014-10-07 06:16:12
在您的示例中,在免费(Ptr)之后,您可以这样做
char* ptr = malloc(1);
free(ptr) // <-- This will delete the pointer
ptr2 = malloc(1) // <-- now you request again现在malloc是它的样子,它可以返回与ptr相同的指针,如果是的话,如果现在返回的话。
// if you call me again and if ptr2 == ptr oops!
free(ptr)-您的ptr2被释放,导致意外的行为,大量的崩溃,痛苦和数小时的调试.
发布于 2014-10-07 06:04:54
这不仅仅是浪费CPU周期。Double free()是undefined behaviour,这意味着允许程序以任意方式运行。
这个程序可能运行得很好,或者在测试中爆炸了,或者通过了你所有的测试,然后在你的客户面前爆炸了,或者它可能破坏了一些数据,或者它可能会引发核打击等等。所有这些都是未定义行为的有效表现。
https://stackoverflow.com/questions/26229511
复制相似问题