Tag: 内存管理

你怎么知道用malloc()分配多少空间?

我是C新手,我来自C#。 我一直在学习内存管理和malloc()函数。 我也遇到过这段代码: char *a_persons_name = malloc(sizeof(char) + 2); 我不明白的是这为a_persons_name分配了多少空间。 是分配2个字符(例如AB)还是别的? 我也知道你有时可以使用malloc “幸运”并使用未分配的空间(这可能导致数据损坏和seg错误)。 那么我怎么知道我分配了多少空间以及我需要多少空间?

如何在预先分配的内存上指向2D / 3D空间

我内存优化了我用于嵌入式使用的代码。 它运行良好,但结果是我获得了大量的1D,2D和3D mallocs,并在函数中间释放,从而减慢了执行时间。 出于几个原因,我决定修改我的方式。 我想在执行开始时用一个malloc分配所有可用的内存,并指出每个数组需要的正确内存空间。 有关信息,我现在在x86上执行此操作,所以我没有任何内存空间问题。 我用这种方式声明我的数组: unsigned char *memory; memory = (unsigned char *)malloc(MYSIZE*sizeof(unsigned char)); type* p1; p1 = (type *)((int)memory + p1_offset); type** p2; p2 = (type **)((int)memory + p2_offset); for (int i=0 ; i<p2_height ; i++) { p2[i] = (type *)((int)p2 + p2_width*sizeof(type)); } 虽然它适用于我的1D指针,但它为我的2D指针声明返回了一个段错误。 我检查了我的偏移量,它们与内存指针相比很好。 由于我没有经验这种方式来宣布我的指针,也许我在这里误解了一些东西,所以如果有人可以向我解释更多关于这种技术的话,我会很高兴!

内存管理:NSString的stringWithCString:编码:

假设我从某个函数中获取了一个C字符串: char * mystring = SomeCFunction(…); 我拥有这个字符串(当我完成时,我负责释放它)。 如果,在Objective-C中,我使用以下命令创建NSString * : NSString * mynsstring = [NSString stringWithCString:mystring encoding:NSUTF8StringEncoding]; 我还有责任释放原来的C字符串吗? 我假设答案是肯定的,但我在文档中找不到明确的答案 – 而相反方法( cStringUsingEncoding )的function虽然很明显,但确实让我暂停,因为它为你处理了cString释放。 如果答案是肯定的,那么我还要负责确保在使用NSString *之前我没有释放c字符串,或者该函数是否为我复制字符串? 我问这个是因为stringWithCString的文档说: 返回包含给定C数组中的字节的字符串,根据给定的编码进行解释。 这仍然让我想知道它是否真的复制了字节,或者只是在内部指向它们(我基本上只是在做一个演员)。

改进malloc()算法的下一步是什么?

我正在编写自己的简单malloc()函数,我想创建更快更有效的变体。 我是使用线性搜索并在内存中顺序和连续分配的函数。 改进此算法的下一步是什么? 我当前版本的主要缺点是什么? 我将非常感谢任何反馈和建议。 typedef struct heap_block { struct heap_block* next; size_t size; bool isfree; }header; #define Heap_Capacity 100000 static char heap[Heap_Capacity]; size_t heap_size; void* malloc(size_t sz) { if(sz == 0 || sz > Heap_Capacity) { return NULL; } header* block = (header*)heap; if(heap_size == 0) { set_data_to_block(block, sz); return (void*)(block+1); } while(block->next != […]

堆和堆栈存储器如何管理,实现,分配

可能重复: 如何堆叠,实现和分配堆栈和堆栈内存? C ++中的堆栈,静态和堆 在C / C ++中,我们可以在堆栈或堆上存储变量,函数,成员函数,类的实例。 每个如何实施? 如何管理(高级别)? gcc是否预先分配了一块用于堆栈和堆的内存,然后根据请求发送出去? 原始内存来自RAM吗? 可以在堆而不是堆栈上分配函数吗? –Clarification– 我真的在询问堆和堆栈存储器的实现和管理。 阅读引用的问题后,我没有找到任何解决这个问题的方法……感谢链接

我可以检查指针是否由malloc / calloc / realloc分配?

我想知道是否可以检查传递给函数的指针是否由malloc / calloc / realloc分配? int main(){ struct something o; struct something *a; a = malloc(sizeof(struct something)); freeSome(&o);/*This would normally throw an (corruption?) error*/ freeSome(a);/*This is fine*/ } void freeSome(struct something * t){ if (/*expression here*/){ free(t); } } 我明白通常你会检查是否t == NULL ,但我只是想知道是否可以查看是否已为给定指针分配了内存。

结构指针数组的内存分配

我正在尝试在C中构建一个内存分配器。用户首先要说明他想要使用多少内存,以及可以提供的最小内存块大小。 因此,举例来说,假设用户请求最小块大小为8B的1024B。 这意味着可能的块大小将是1024,512,256,128,64,32,16和8。 为了跟踪空闲的内存块,我有一个结构指针数组。 这些结构称为Header,该数组称为FreeList。 我的意思是FreeList [0]将包含一个指向内存空间的指针,其中有一个内存块大小为8. FreeList [1]将包含一个指向内存空间的指针,其中有一块内存大小为16等等 typedef void * Addr; struct Header { Addr next; int order; }; struct Header *FreeList[]; 我正在尝试为此空闲列表分配内存以使用以下代码: FreeList = malloc(Order*sizeof(struct Header)); 其中Order是您可以拥有的不同块大小的数量。 我收到编译错误’FreeList’的类型不完整。 我不希望这些指针指向任何地方,我只想为数据分配空间。

无需任何工具即可调试内存泄漏问题

采访者 – 如果您没有工具来检查如何检测内存泄漏问题? 回答 – 我将读取代码并查看我分配的所有内存是否已由代码本身释放。 面试官不满意。 有没有其他方法可以这样做?

在C中处理内存分配的最佳方法?

我认为我已经很好地掌握了如何在C ++中处理内存,但在C中进行操作是不同的我有点不对劲。 在C ++中我有构造函数和析构函数,我有非常简单的new和delete,我知道如何使用RAII封装它,使用智能指针和类。 但是在CI中无法以同样的方式处理malloc和free。 我不知道如何隐藏它们以及如何自动化。 我所能想到的只是使用函数来启动和销毁我的指针。 但是我应该如何构建我的内存处理? 在写这篇文章时,我意识到这更像是一个关于我理解C流程的问题,而不是其他任何问题,但一次只能提出一个问题。 编辑 :谢谢你的答案,但我需要改写自己。 当我说我使用RAII和C ++的智能指针时,我不希望C相同,我知道它不一样。 但是我如何处理C ++中的内存分配与这些技术有关。 例如,在我的类中,我动态地添加和销毁我的类使用的内存。 这样我可以实现一种封装,我不需要知道类何时/如何/为什么类处理它的内存,它就是这样。 这意味着我可以“隐藏”较低的内存处理,只关注一些“​​更大”的类。 我想知道的是在C中处理内存的最佳做法是什么? 没有带有构造函数/析构函数的类来为我处理这个问题。 在函数的开头分配内存或使用为我创建它的函数是否合适? 我应该如何再次释放他们? 这些是广泛的问题,它们因情况而异,但您更喜欢如何处理呢? 您可以提供哪些提示和课程?

实现自己的内存池

我想预先分配一定数量的内存,并将该内存用于程序的其余部分。 该程序基本上将为一些字符串和结构分配内存。 我该如何实现? 什么数据结构用于存储指针,如何使用它来给我一个特定的数量? 例如,如果我malloc 1 MB的空间并将其放在指针p ,我该如何从中创建250 KB的片段? 这只是一个快速而肮脏的实现。