Tag: 内存管理

在C ++代码中使用/混合C?

在C ++中使用C是不是很糟糕? 很多人告诉我在C ++中使用C是不好的,因为它不那么安全,而且需要更多的内存管理。 我一直告诉他们,只要你知道你在做什么,你删除你的“新”并释放你的“malloc”,那么C不是问题。 我目前正在一个论坛上发生关于std::string与char*的争论。 有些人说分配一个简单的char*内存块效率更高,只要你解除分配它就没问题了。 另一方面,我们有人说std::string是优越的,因为它没有涉及内存管理,但效率较低。 所以这里的主要问题是: 混合C / C ++坏吗? 在编写C ++时,你是否只能使用100%C ++? 任何答案将不胜感激!

删除链接列表中具有特定值的所有节点

标题非常自我解释。 这是我为此目的编写的函数: void wipeLoneCells() { cell *tmp; tail = head; while (1) { if (head == tail && !tail->flag) { head = head->next; free(tail); tail = head; continue; } tmp = tail->next; /***/ if (tmp->next == NULL && !tmp->flag) { tail->next = NULL; free(tmp); break; } else if (!tmp->flag) { tail->next = tmp->next; free(tmp); continue; […]

内存碎片分析器

有没有好的内存碎片分析器? (linux gcc版本会很好)。 Valgrind无法分析它,因为它使用自定义malloc / free函数。 谢谢,安德鲁

如何在内存中代表Carrays?

我相信如果你使用C,我理解在内存中如何表示正常的变量和指针。 例如,很容易理解指针Ptr将具有一个地址,并且它的值将是一个不同的地址,这是它指向的内存空间。 以下代码: int main(){ int x = 10; int *Ptr; Ptr = &x; return 0; } 将在内存中具有以下表示: +———————+————-+———+ | Variable Name | Address | Value | +———————+————-+———+ | x | 3342 | 10 | +———————+————-+———+ | Ptr | 5466 | 3342 | +———————+————-+———+ 但是我发现很难理解数组如何在内存中表示。 例如代码: int main(){ int x[5]; x[0]=12; x[1]=13; x[2]=14; printf(“%p\n”,(void*)x); printf(“%p\n”,(void*)&x); […]

如何通过调用malloc()来分配多少空间?

我正在尝试编写像这样的大小函数: size(void *p,int size); 这将返回p指向的数组的大小。 例如: Int *a = malloc((sizeof(int)*100)); size(a,sizeof(int)); // this should return 100 我认为这是可能的,因为如果我记得,malloc会跟踪在某些头字节中分配的空间。 这是我到目前为止所拥有的: int size(void *p, int size) { p = (unsigned int *)p – 1; unsigned int elements = (*(unsigned int *)p); return elements/size; } 现在,假设分配的空间大小在指针之前的4个字节中,这应该返回字节或偏移量。 这是我有点黑暗的地方。 我无法弄清楚malloc如何格式化这些头字节的细节。 malloc如何打包标头位? 谢谢,我很感激。 我确定这段代码有问题,而且它不是特别便携,可能与系统有关,但我这样做很有趣。

为什么在释放指向它的指针后仍然可以访问结构的成员?

如果我定义一个结构…… struct LinkNode { int node_val; struct LinkNode *next_node; }; 然后创建一个指向它的指针…… struct LinkNode *mynode = malloc(sizeof(struct LinkNode)); …然后终于免费()它…… free(mynode); …我仍然可以访问结构的’next_node’成员。 mynode->next_node 我的问题是: 底层机制的哪一部分跟踪这个内存块应该代表一个结构LinkNode的事实? 我是C的新手,我期望在我使用指向我的LinkNode的指针上的free()后,我将无法再访问该结构的成员。 我期待某种“不再可用”的警告。 我想更多地了解基础流程的工作原理。

如何在realloc之后将新内存清零

在保持最初分配的内存完好无损的同时调用realloc后,将新内存清零的最佳方法是什么? #include #include #include #include size_t COLORCOUNT = 4; typedef struct rgb_t { int r; int g; int b; } rgb_t; rgb_t** colors; void addColor(size_t i, int r, int g, int b) { rgb_t* color; if (i >= COLORCOUNT) { // new memory wont be NULL colors = realloc(colors, sizeof(rgb_t*) * i); //something messy like […]

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

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

如何在C语言中“调用”fortran例程中分配一个数组

我认为头衔说我需要什么。 我知道我们可以使用“asd”函数来执行此操作,但由于某些原因,我需要在Fortran中进行分配(即在子例程“asd_”中)。 这是C代码: #include void asd(float **c) { *c = (float *) malloc (2*sizeof(float)); **c =123; *(*c+1)=1234; } void asd_(float **c); main () { float *c; asd_(&c); // asd(&c); would do the job perfectly printf(“%f %f \n”,c[0],c[1]); return 0; } 这是Fortran代码: subroutine asd(c) implicit none real, pointer, allocatable ::c(:) print *, associated(c) if(.not. associated(c)) allocate(c(2)) […]

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

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