Tag: 免费

在C中,是否需要在退出处释放指针?

可能重复: 退出C应用程序时,是否自动释放了malloc-ed内存? 在C中,是否需要在退出处释放指针? 当程序存在时,是否从指向仍然指向已分配块的指针释放内存? 它依赖于操作系统吗?

释放函数中的malloced结构

我正在创建一个包含缓冲区function的源文件,我想用于我正在创建的其他库。 它工作正常但我无法摆脱我在其中一个函数中创建的缓冲区结构。 以下片段应该有助于说明我的问题: C头: //dbuffer.h … typedef struct{ char *pStorage; int *pPosition; int next_position; int number_of_strings; int total_size; }DBUFF; … C源: //dbuffer.c … DBUFF* dbuffer_init(char *init_pArray) { //Find out how many elements the array contains int size = sizeof_pArray(init_pArray); //Initialize buffer structure DBUFF *buffer = malloc(sizeof(DBUFF)); //Initialize the storage buffer->pStorage = malloc( (sizeof(char)) * (size) […]

是由程序员在exit()上解除分配吗?

我有一个程序,当我从键盘输入错误数据时,它只是退出exit(1) 。 我正在使用Valgrind进行测试,虽然发生这种情况但没有错误,但我可以看到仍有可达的x字节。 所以我的问题是:程序员在点击exit()或exit()操作系统exit()之前是否需要释放内存?

当使用free()释放内存时,为什么指针指向的内容没有改变?

在动态内存分配方面,我是新手。 当我们使用void free(void *ptr)释放内存时,内存被释放,但指针的内容不会被删除。 这是为什么? 最新的C编译器有什么区别吗?

在C中释放()malloc的二维数组的最佳方法

假设我有一个用这样的东西创建的二维数组, char **foo = (char **) malloc(height * sizeof(char *)); for(i = 0; i <= height; i++) foo[i] = (char *) malloc (width * sizeof(char *)); 首先,这甚至是创建像这样的数组的正确方法吗? 这里的问题是,’height’和’width’是在运行时设置的东西。 这似乎有效,但这是释放这个2Darrays的最佳策略。 免费(funge)听起来不对。 通过这里的其他post,我想我会逐一释放每一行? 我确实试过这样的事, for (height = 0; height funge_height; height++) { free(funge[height]); } free(funge) 然而,这给了我一个双重自由指针exception。 这是不是意味着,我不需要管理这段记忆? 我的印象是,对于每个malloc的内存,我们应该调用free()。

在C中重用已释放的指针

这个网站上有很多关于在使用后释放指针的问题,并且进一步将它们设置为NULL。 争论很激烈,主题看似平分。 例如: 这个问题 。 一般来说,我对释放指针很困惑。 想象一下,你有一个指向一些内存空间的指针。 使用空格后,释放指针但不将其设置为NULL。 稍后,你有另一个指针调用malloc()或一些模拟,它被分配内存,包括先前释放的内存(原始指针仍指向)。 如果这个新指针写入此内存块,会发生什么? 直觉上什么都不会发生,但早先提供的链接中的OP写道它会使程序崩溃。 所以我的问题是: 给定一个释放指针,是什么阻止您将指针重新分配给新的内存位置? 为什么重用已释放的指针是“坏”的做法? 如果调用free(ptr)只将此内存返回给操作系统,为什么不能重新分配指针以便其他内存位置并重用它? char *ptr = malloc(sizeof(*ptr)); //first allocation free(ptr); //release memory ptr = NULL; ptr = malloc(sizeof(*ptr)); //reallocate 为什么写入以前释放的内存块,仍然有原始指针,导致程序崩溃? – 请参阅上面链接的问题的第一篇文章的第一段(如果我误解了本段的意图,请解释,因为不明确是否再次使用该指针来写入内存或创建新指针。)

从错误返回后释放内存的最佳方法是什么?

假设我有一个为调用者分配内存的函数: int func(void **mem1, void **mem2) { *mem1 = malloc(SIZE); if (!*mem1) return 1; *mem2 = malloc(SIZE); if (!*mem2) { /* … */ return 1; } return 0; } 在第二个malloc()失败的情况下,我想听听你对free()分配内存的最佳方法的反馈。 你可以想象一个更复杂的情况,有更多的错误退出点和更多的分配内存。

为什么我不应该对未由malloc()分配的变量调用free()?

我在某处读到使用free来摆脱一个不是通过调用malloc创建的对象是灾难性的,这是真的吗? 为什么?

free()不解除内存?

free(str); printf(“%d\n”, str->listeners); 对printf的调用成功(对str的成员的任何其他调用也是如此)。 这怎么可能?

为什么free()不能真正释放内存?

我正在做一些分配和释放内存的测试。 这是我正在使用的代码: #include #include #define WAVE_SIZE 100000000 int main(int argc,char* argv[]){ int i; int **p; printf(“%d allocs…\n”,WAVE_SIZE); // Malloc printf(“Allocating memory…\n”); p = (int**)malloc(WAVE_SIZE*sizeof(int*)); for(i = 0;i < WAVE_SIZE;i++) p[i] = (int*)malloc(sizeof(int)); // Break printf("Press a key to continue…\n"); scanf("%*s"); // Dealloc printf("Deallocating memory…\n"); for(i = 0;i < WAVE_SIZE;i++) free(p[i]); free(p); // Break printf("Press a […]