Tag: malloc

malloc如何在multithreading环境中工作?

典型的malloc (针对x86-64平台和Linux操作系统)是否在开始时天真地locking了一个互斥锁,并在完成时释放它,还是以更聪明的方式locking互斥锁,从而减lesslocking争用? 如果这确实是第二种方式,它是如何做到的?

如果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)知识?

tcmalloc / jemalloc和内存池之间有什么区别?

tcmalloc / jemalloc是改进的内存分配器,内存池也被引入更好的内存分配。 那么它们之间有什么区别,以及如何在我的应用程序中select它们呢?

如果`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? }

有没有办法标记一块分配的内存只读?

如果我使用malloc()分配一些内存,有没有办法只读标记它。 所以memcpy()失败,如果有人试图写入它? 这被连接到一个错误的APIdevise,用户无法使用由大型内存结构的一部分GetValue()方法返回的const指针。 由于我们要避免复制大量内存,因此我们将活动指针返回到特定格式的结构化内存中。 现在的问题是,有些用户发现通过直接写入这个内存到达那里工作的东西,避免SetValue()调用分配和正确地交付我们开发的内存二进制格式。 尽pipe在某些时候黑客可能会工作,但是由于控制标志的解释不正确而被用户覆盖,导致内存访问冲突。 教育用户是一项任务,但让我们说现在我们想要代码失败。 我只是想知道我们是否可以简单地防范这种情况。 对于比喻,假设有人从sqlite语句中获得一个blob列,然后回写给它。 虽然在sqlite的情况下,这是没有道理的,但在我们的情况有点happing。

C APIdevise:谁应该分配?

什么是在C API中分配内存的正确/首选的方式? 起初我可以看到两个select: 1)让调用者做所有的(外部)内存处理: myStruct *s = malloc(sizeof(s)); myStruct_init(s); myStruct_foo(s); myStruct_destroy(s); free(s); _init和_destroy函数是必要的,因为可能会在内部分配更多的内存,并且必须在某处处理它。 这有一个更长的缺点,而且malloc可以在某些情况下被消除(例如,它可以通过一个堆栈分配的结构: int bar() { myStruct s; myStruct_init(&s); myStruct_foo(&s); myStruct_destroy(&s); } 另外,调用者必须知道结构的大小。 2)在_init隐藏malloc ,在_destroy free s。 优点:较短的代码,因为function将被称为无论如何。 完全不透明的结构。 缺点:不能通过以不同方式分配的结构体。 myStruct *s = myStruct_init(); myStruct_foo(s); myStruct_destroy(foo); 我现在正在倾向于第一个案件。 那么我又不了解C API的devise。

为什么我得到一个C malloc断言失败?

我正在实现一个分而治之的多项式algorithm,所以我可以将它与OpenCL实现进行基准testing,但是我无法使malloc正常工作。 当我运行程序时,它分配了一堆东西,检查一些东西,然后将size/2发送给algorithm。 然后当我再次打到malloc线时,它吐出这个: malloc.c:3096:sYSMALLOc:Assertion`(old_top ==(((mbinptr)(((char *)&((av) – > bins [((1) – 1)* 2]))__builtin_offsetof(struct malloc_chunk,fd))))&& old_size == 0)|| ((unsigned long)(old_size)> =(unsigned long)((((_builtin_offsetof(struct malloc_chunk,fd_nextsize))+((2 *(sizeof(size_t))) – 1))&〜((2 * (size_t))) – 1)))&&((old_top) – > size&0x1)&&((unsigned long)old_end&pagemask)== 0)'failed。 中止 有问题的线是: int *mult(int size, int *a, int *b) { int *out,i, j, *tmp1, *tmp2, *tmp3, *tmpa1, *tmpa2, *tmpb1, *tmpb2,d, *res1, […]

在C中,我将如何select是否返回一个结构或指针结构?

最近在我的C肌肉工作,并通过我一直在努力的许多图书馆看,当然给了我一个很好的主意,什么是好的做法。 有一件事,我没有看到是一个函数,返回一个结构: something_t make_something() { … } 从我所吸收的是这样做的“正确的”方式: something_t *make_something() { … } void destroy_something(something_t *object) { … } 代码片段2中的架构比FAR更受欢迎。所以现在我问,为什么我会直接返回一个结构,就像在代码片段1中那样? 当我在两种select之间进行select时,我应该考虑哪些差异? 此外,这个选项如何比较? void make_something(something_t *object)

Xcode Guard Malloc和在设备上debugging:'libgmalloc.dylib'图像未find

我启用了Xcode中的内存检查(Edit Scheme – > Options)。 当我在设备上进行debugging时,我现在得到以下内容: dyld: could not load inserted library '/usr/lib/libgmalloc.dylib' because image not found 。 这项措施是积极采取的,希望在周期的早期发现错误。 内存检查在设备上无效吗? 由于已根据http://lists.apple.com/archives/xcode-users/2012/Mar/msg00271.html进行了确认和调查,因此它似乎是有效的。 而且,Xcode在编译和链接过程中没有任何抱怨。 如果它对设备无效,为什么Xcode插入库? 有没有解决办法? 谷歌search返回一些点击 ,但我没有看到任何具体的解决scheme。 在设备上进行debugging时,如何启用Xcode Guard Malloc?

Cstring中'\ 0'之后的内存会发生什么?

令人惊讶的简单/愚蠢/基本的问题,但我不知道:假设我想返回我的函数的用户一个Cstring,其长度我不知道在函数的开始。 我可以在一开始只放置长度的上限,并且根据处理,尺寸可能缩小。 问题是,分配足够的堆空间(上限)是否有问题,然后在处理过程中终止string? (a。) free()仍然正常工作,(b。)在'\ 0'之后的空格变得无关紧要了吗? 一旦添加了“\ 0”,内存是否返回,还是坐在那里占用空间,直到free()被调用? 为了节省一些前期编程时间,在调用malloc之前计算必要的空间,通常是不好的编程风格吗? 为了给这个上下文,我们假设我想删除连续的重复,像这样: input“Hello oOOOo !!” – >输出“Helo oOo!” …以及下面的一些代码展示了我如何预先计算我的操作所产生的大小,有效地执行两次处理来获得堆大小的权利。 char* RemoveChains(const char* str) { if (str == NULL) { return NULL; } if (strlen(str) == 0) { char* outstr = (char*)malloc(1); *outstr = '\0'; return outstr; } const char* original = str; // for reuse char prev […]