Tag: 免费

如果free()知道我的数组的长度,为什么我不能在我自己的代码中请求它?

我知道将dynamic分配数组的长度传递给操作它们的函数是一个常见的约定: void initializeAndFree(int* anArray, size_t length); int main(){ size_t arrayLength = 0; scanf("%d", &arrayLength); int* myArray = (int*)malloc(sizeof(int)*arrayLength); initializeAndFree(myArray, arrayLength); } void initializeAndFree(int* anArray, size_t length){ int i = 0; for (i = 0; i < length; i++) { anArray[i] = 0; } free(anArray); } 但是如果没有办法让我从指针中获取分配的内存的长度,那么free()自动“知道当我给它的东西是什么时候释放的是同一个指针? 为什么我不能像C程序员那样获得魔法? free()从哪里获得免费(har-har)知识?

无法释放C中的const指针

我怎样才能释放一个const char* ? 我使用malloc分配新的内存,当我试图释放它时,我总是收到错误“不兼容的指针types” 导致这个问题的代码是这样的: char* name="Arnold"; const char* str=(const char*)malloc(strlen(name)+1); free(str); // error here

如果`malloc(0)`返回一个非空指针,我可以把它传递给`free`吗?

我一直在阅读关于在请求一个零大小的块时malloc行为的讨论。 我明白, malloc(0)的行为是实现定义的,它应该返回一个空指针, 或者一个非空指针,但我不应该访问。 (这是有道理的,因为不能保证它指向任何可用的内存。) 但是,如果得到这样一个不可访问的非空指针,我可以通过它以通常的方式来free它? 或者是非法的,因为我从malloc(0)得到的指针可能不指向一个实际分配的内存块? 具体来说,下面的代码是否有明确的行为: #include <stdio.h> #include <stdlib.h> int main() { int* x = (int*) malloc(0); if (x == NULL) { printf("Got NULL\n"); return 0; } else { printf("Got nonnull %p\n", x); } free(x); // is calling `free` here okay? }

释放它们之后,真的应该设置指向NULL的指针吗?

在释放它们之后,似乎有两个参数为什么应该设置一个指向NULL的指针。 当释放双指针时避免崩溃。 简而言之:无意中调用free() ,当它被设置为NULL时不会崩溃。 几乎总是这样掩盖了一个逻辑错误,因为没有理由再次调用free() 。 让应用程序崩溃并修复它会更安全。 不能保证崩溃,因为有时候新的内存被分配在相同的地址。 当有两个指向相同地址的指针时,主要发生双重空闲。 逻辑错误也可能导致数据损坏。 避免重复使用已释放的指针 简而言之:访问释放的指针可能会导致数据损坏,如果malloc()在相同的位置分配内存,除非释放的指针设置为NULL 如果偏移量足够大( someStruct->lastMember , theArray[someBigNumber] ), theArray[someBigNumber]不能保证程序在访问NULL指针时崩溃。 而不是崩溃会有数据损坏。 将指针设置为NULL不能解决具有相同指针值的不同指针的问题。 问题 这里有一个post,在释放后盲目地将一个指针设置为NULL 。 哪一个更难debugging? 有两种可能性吗? 这种错误有多大可能导致数据损坏而不是崩溃? 随意扩大这个问题。

在不同的function分配的空闲内存?

我试图学习C和我目前正在尝试编写一个基本的堆栈数据结构,但我似乎无法获得基本的malloc / free权利。 这里是我一直在使用的代码(我只是在这里发表一小部分来说明一个特定的问题,而不是总代码,但是错误信息是通过在valgrind运行这个示例代码来生成的) #include <stdio.h> #include <stdlib.h> typedef struct Entry { struct Entry *previous; int value; } Entry; void destroyEntry(Entry entry); int main(int argc, char *argv[]) { Entry* apple; apple = malloc(sizeof(Entry)); destroyEntry(*(apple)); return 0; } void destroyEntry(Entry entry) { Entry *entry_ptr = &entry; free(entry_ptr); return; } 当我通过valgrind运行–leak-check=full –track-origins=yes ,出现以下错误: ==20674== Invalid free() / […]

为什么C中的`free`没有占用要释放的字节数呢?

只是要清楚:我知道malloc和free是在C库中实现的,它通常从操作系统中分配大量内存,并进行自己的pipe理,将较小的内存分配给应用程序,并跟踪分配的字节。 这个问题不是如何免费知道自由多less 。 相反,我想知道为什么free这样摆在首位。 作为低级语言,我认为要求C程序员不仅要记住分配了什么内存,而且要记住多less(事实上,我通常会发现我最终跟踪了字节数无论如何都是)。 我也发现,明确地给出free字节数可能会允许一些性能优化,例如,具有用于不同分配大小的单独池的分配器将能够通过查看input参数来确定哪个池可以被释放,整体上将会有更less的空间开销。 所以,简而言之,为什么malloc和free创build的,因此需要内部跟踪分配的字节数? 这只是一个历史的意外? 一个小小的编辑:一些人提供了一些问题,如“如果你释放的数量与你分配的数量不同”。 我想象中的API可能只需要一个准确地释放分配的字节数; 释放或多或less可以简单地被UB或实现定义。 不过,我不想阻止关于其他可能性的讨论。

免费字符*:无效的下一个大小(快)

在连接过程之后,我释放了char *。 但是我收到这个错误: 免费():无效的下一个大小(快):0x0000000001b86170 以下是我的代码: void concat(stringList *list) { char *res = (char*)malloc(sizeof(char*)); strcpy(res, list->head->string); list->tmp = list->head->next; while (list->tmp != NULL) { strcat(res, ","); strcat(res, list->tmp->string); list->tmp = list->tmp->next; } printf("%s\n", res); free(res); }

空闲后将variables设置为NULL

在我的公司有一个编码规则,说释放任何内存后,将该variables重置为NULL。 例如 … void some_func () { int *nPtr; nPtr = malloc (100); free (nPtr); nPtr = NULL; return; } 我觉得,在像上面显示的代码的情况下,设置为NULL没有任何意义。 还是我错过了什么? 如果在这种情况下没有意义的话,我会去接受“质量小组”去除这个编码规则。 请指教。

free和malloc如何在C中工作?

我试图找出如果我试图释放一个“从中间”的指针会发生什么,例如,看看下面的代码: char *ptr = (char*)malloc(10*sizeof(char)); for (char i=0 ; i<10 ; ++i) { ptr[i] = i+10; } ++ptr; ++ptr; ++ptr; ++ptr; free(ptr); 我得到一个未处理的exception错误信息的崩溃。 我想知道为什么和如何自由工作,以便我不仅知道如何使用它,而且能够理解奇怪的错误和exception,并更好地debugging我的代码 非常感谢

当你在malloc之后没有自由时真的会发生什么?

这已经困扰了我很多年了。 我们都在学校教书(至less,我是),你必须释放每一个分配的指针。 不过,对于没有释放内存的真正代价,我有些好奇。 在一些明显的情况下,例如malloc在循环或线程执行的一部分中被调用时,释放非常重要,所以没有内存泄漏。 但是请考虑以下两个示例: 首先,如果我有这样的代码: int main() { char *a = malloc(1024); /* Do some arbitrary stuff with 'a' (no alloc functions) */ return 0; } 这里真正的结果是什么? 我的想法是,这个过程死了,然后堆空间已经消失了,所以没有任何伤害,错过了free的呼吁(但是,我确实认识到无论如何,closures,可维护性和良好的做法的重要性)。 我对这个想法是否正确? 其次,让我们说我有一个程序,有点像一个壳。 用户可以声明像aaa = 123这样的variables,并将这些variables存储在某些dynamic数据结构中供以后使用。 很显然,你会使用一些解决scheme来调用一些* alloc函数(hashmap,链表,类似的东西)。 对于这种types的程序,在调用malloc之后永远不会释放,因为这些variables必须在程序执行期间一直存在,并且没有什么好的方法(我可以看到)使用静态分配的空间来实现这一点。 有一堆分配的内存,但只作为过程结束的一部分被释放,这是不好的devise吗? 如果是的话,还有什么select?