Tag: 免费

返回函数前释放已分配的内存

我试图在函数中使用malloc返回一个数组: char* queueBulkDequeue(queueADT queue, unsigned int size) { unsigned int i; char* pElements=(char*)malloc(size * sizeof(char)); for (i=0; i<size; i++) { *(pElements+i) = queueDequeue(queue); } return pElements; } 问题是我需要释放它,因为我的MCU堆大小有限。 但是我想要退回它,所以我不能在function中释放它,对吧? 我可以在函数外部释放已分配的内存(我称之为函数)。 这有什么最好的做法吗? 先感谢您!

在c中分配内存并保存字符串

我想知道为什么以下代码不起作用 int main(int argc, char **argv) { char *test = (char*) malloc(12*sizeof(char)); test = “testingonly”; free(test); } 在考虑之后,我的假设是首先在内存中为12个字符分配空间,但是下一行中的赋值在堆栈上创建一个char数组,并将其内存地址传递给test。 所以free()尝试释放堆栈上不允许的空间。 那是对的吗? 那么在堆上保存字符串的正确方法是什么? 以下是一种常见的方式吗? int main(int argc, char **argv) { char *test = (char*) malloc(12*sizeof(char)); strcpy(test, “testingonly”); free(test); }

我可以假设用较小的大小调用realloc会释放余数吗?

让我们考虑一下非常简短的代码片段: #include int main() { char* a = malloc(20000); char* b = realloc(a, 5); free(b); return 0; } 在阅读了realloc的手册页后,我不完全确定第二行会导致释放19995个额外字节。 引用手册页: The realloc() function changes the size of the memory block pointed to by ptr to size bytes. ,但根据这个定义,我可以确定其余的将被释放吗? 我的意思是, b指向的块当然包含5个空闲字节,所以对于懒惰的顺从分配器是否足以为realloc行做什么? 注意:我使用的分配器似乎释放了19 995个额外字节,如valgrind在注释掉free(b)行时所示: ==4457== HEAP SUMMARY: ==4457== in use at exit: 5 bytes in 1 blocks […]

C – 设计你自己的free()函数

今天,我出现在面试中,面试官问我这个, 告诉我你将如何设计自己的free( )函数来解除分配内存的步骤。 它如何比C的默认free()函数更有效? 你能得出什么结论? 我很困惑,想不出设计的方式。 你们觉得怎么样 ? 编辑:因为我们需要知道malloc()如何工作,你能告诉我编写自己的malloc()函数的步骤

为什么我的指针在空闲后不为空?

void getFree(void *ptr) { if(ptr != NULL) { free(ptr); ptr = NULL; } return; } int main() { char *a; a=malloc(10); getFree(a); if(a==NULL) printf(“it is null”); else printf(“not null”); } 为什么这个程序的输出不是NULL?

释放指针并将其指定为NULL有什么区别?

有人能告诉我两者之间的区别: int *p; p=(int*)malloc(10*sizeof(int)); free(p); 要么 int *p; p=(int*)malloc(10*sizeof(int)); p=NULL;

C中的双重自由或腐败3d数组

在释放3d数组时,我遇到了“双重释放或损坏”错误。 任何人都可以告诉我代码中的问题在哪里? arrays的大小为2 * N * N. 这里N的值是100.即使没有铸造,也是相同的结果。 这是代码: // Mallocing double ***h = malloc(2 * (sizeof(double**))); for(i = 0; i < N; i++) { h[i] = malloc(N * sizeof(double*)); for(j = 0; j < N; j++) { h[i][j] = malloc(N * sizeof(double)); } } // Freeing for(i = 0; i < N; i++) { […]

我调用free(),但指针仍然有数据,它的内容没有改变

代码如下。 我的问题是结果。 我想明白,为什么在调用free(p)p-> elem变为’0’之后,但是p-> str仍然包含“hello”? #define LEN (sizeof(struct node)) typedef struct node { int elem; char *str; }*p_node; int main(void) { p_node p; p=(p_node)malloc(LEN); p->elem=99; p->str=”hello”; printf(“the p->elem:%d\n”,p->elem); printf(“the p->str :%s\n”,p->str); free(p); printf(“the p->elem:%d\n”,p->elem); printf(“the p->str :%s\n”,p->str); return 0; }

程序结束时释放块没有意义吗?

可能重复: 在C中退出程序时释放所需的内存 我正在阅读“使用malloc分配的Freeing Memory”页面,并查看了这句话: 在程序结束时释放块是没有意义的,因为当进程终止时,所有程序的空间都会返回给系统。 我意识到作者试图说的是什么,但句子不应该是: 在程序结束时释放块是没有意义的,因为当进程终止时,所有程序的空间都会返回给系统, 尽管你仍然应该确保程序在退出之前释放所有malloc的内存 。 或者通常的做法是在流程终止之前不解除内存分配?

传递给free()的指针是否必须指向内存块的开头,还是指向内部?

问题在于标题……我搜索但找不到任何东西。 编辑: 我真的没有必要解释这个问题,但是因为人们认为我说的话毫无意义(我问的是错误的问题),这就是问题所在: 由于人们似乎对所有问题的“根”原因非常感兴趣而不是实际提出的问题(因为这显然有助于事情得到更好的解决,让我们看看它是否确实如此),这就是问题所在: 我正在尝试基于NTDLL.dll创建一个D运行时库,这样我就可以将该库用于Win32子系统以外的子系统。 所以这迫使我只与NTDLL.dll链接。 是的,我知道这些function是“无证件”的,并且随时都可能发生变化(即使我打赌一百美元, wcstombs在20年后仍会做同样的事情,如果它仍然存在的话)。 是的,我知道人们(尤其是微软)不喜欢开发人员链接到该库,并且我可能会因此而受到批评。 是的,上述两点意味着在Win32子系统之前运行的程序如chkdsk和碎片整理程序甚至不应该首先创建,因为它几乎不可能与kernel32.dll或msvcrt.dll之类的东西链接。仍然有NT本地可执行文件,所以我们开发人员应该假装这些阶段是永远不在我们的范围之内。 但不 ,我怀疑这里的任何人都希望我粘贴几千行代码并帮助我浏览它们并试图弄清楚为什么未修改的内存分配被我正在修改的源代码拒绝。 所以这就是为什么我问起一个不同于“根”原因的问题,即使这被认为是社区的最佳实践。 如果事情仍然没有意义,请随时在下面发表评论! 🙂 编辑2: 经过大约8个小时的调试,我终于找到了问题: 事实certificate,如果给它的指针是NULL , RtlReAllocateHeap()不会像RtlAllocateHeap() 那样自动工作。