标签: malloc

C中的malloc()有哪些有用的例子?

我只是malloc()在C 读书.

维基百科文章提供了一个例子,但它甫一为10个整数与比较阵列分配足够的内存int array[10].不是很有用.

你什么时候决定用malloc()C来处理你的记忆?

c malloc

14
推荐指数
1
解决办法
3万
查看次数

mach_vm_map失败(错误代码= 3)

在我的iPAD应用程序导航一段时间后,我注意到应用程序的响应速度越来越慢,最后我的应用程序崩溃,出现以下错误

    AppName(1779,0x3d12d18c) malloc: *** mach_vm_map(size=167936) failed (error code=3)
    *** error: can't allocate region
    *** set a breakpoint in malloc_error_break to debug
    Jan  7 11:34:30  AppName[1779] <Error>:   at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication.UIApplicationMain (int,string[],intptr,intptr) <0xffffffff>
    Jan  7 11:34:30  AppName[1779] <Error>:   at MonoTouch.UIKit.UIApplication.Main (string[],string,string) <0x0012b>
    Jan  7 11:34:30  AppName[1779] <Error>:   at AppName.Application.Main (string[]) <0x0002f>
    Jan  7 11:34:30  AppName[1779] <Error>:   at (wrapper runtime-invoke) object.runtime_invoke_dynamic (intptr,intptr,intptr,intptr) <0xffffffff>
Run Code Online (Sandbox Code Playgroud)

这是一个与记忆有关的问题吗?

crash malloc xamarin.ios xamarin

14
推荐指数
1
解决办法
2万
查看次数

realloc():重新分配时为下一个大小无效,以便为char*上的strcat腾出空间

我在以下代码中收到无效的内存错误:

printf(" %s\n","FINE 5");
printf("%s LENGTH IS: %d\n","FINE 6",strlen(": "));
buffer = (char *)realloc(buffer, strlen(buffer)* sizeof(char) + (strlen(": ")+1)* sizeof(char));
printf(" %s\n","FINE 7");
strcat(buffer, ": \0");
Run Code Online (Sandbox Code Playgroud)

输出:

FINE 5
FINE 6 LENGTH IS:
检测到 2 *glibc* ./auto:realloc():下一个大小无效:0x08cd72e0***======= Backtrace:=========/lib/tls /i686/cmov/libc.so.6(+0x6b591)[0x6dd591]

这里需要注意的Fine 7是从未打印过.每次运行时无效的下一个大小错误位于同一位置.

发现这种相关性

c string malloc realloc strcat

13
推荐指数
2
解决办法
5万
查看次数

C:动态分配数组的memcpy速度

我需要有关以下代码性能的帮助.它对两个动态分配的任意大小的数组执行memcpy:

int main()
{
  double *a, *b;
  unsigned n = 10000000, i;
  a = malloc(n*sizeof(double));
  b = malloc(n*sizeof(double));
  for(i=0; i<n; i++) {
    a[i] = 1.0;
    /* b[i] = 0.0; */
  }

  tic();
  bzero(b, n*sizeof(double));
  toc("bzero1");

  tic();
  bzero(b, n*sizeof(double));
  toc("bzero2");

  tic();
  memcpy(b, a, n*sizeof(double));
  toc("memcpy");
}
Run Code Online (Sandbox Code Playgroud)

tic/toc测量执行时间.

在我的电脑上,memcpy需要0.035秒(Linux,gcc版本4.4.6).如果我现在取消注释初始化目标数组b的行,则代码快三倍(!) - 0.011s.

我在使用循环而不是memcpy时观察到类似的行为.通常我不关心这个,因为它足以在使用之前"初始化"内存.但是,我现在需要执行一个简单的内存复制,并尽可能快地完成.初始化数据需要将0写入存储器,这不是必需的并且需要时间.我想用所有可用的内存带宽执行内存复制.

有这个问题的解决方案吗?或者它是否与Linux处理动态内存的方式相关(某种懒惰的页面分配?)并且无法解决?它在其他系统上怎么样?

编辑:使用gcc 4.6获得相同的结果.我用-O3编译.

编辑: 谢谢大家的意见.我明白内存映射需要时间.我想我只是很难接受它需要这么长时间,比实际的内存访问时间长得多.代码已被修改为包含使用两个后续bzero调用的数组b初始化的基准.时间现在显示

bzero1 0.273981
bzero2 0.056803
memcpy 0.117934

显然,第一bzero调用做多的不止流零记忆-这是内存映射和内存归零.另一方面,第二个bzero调用占用了memcpy所需的一半时间,这与预期完全一样 - 只写时间与读写时间.据我所知,由于操作系统安全原因,第二次bzero调用的开销必须在那里.剩下的呢?我能否以某种方式减少它,例如使用更大的内存页面?不同的内核设置?

我应该提一下,我在Ubuntu wheeze上运行它.

c malloc performance memcpy

13
推荐指数
3
解决办法
2698
查看次数

在函数返回后,函数中分配的内存是否仍然保持分配状态?

对于下面的代码: (1) "main"调用函数"f1". (2)函数"f1"做一些数字运算; 使用malloc创建一个"char"数组,然后将数组的指针返回给main(不分配-freeing-数组).

我有3个与案例相关的问题: (1)我假设,虽然函数"f1"已经终止,但分配的char数组仍然保持分配状态,直到主程序完全终止.也就是说,分配的内存仍然属于主内存,没有其他进程可以从外部访问(我的意思是,干扰)它.我对吗? (2)在程序终止之前是否必须释放数组(在"f1"中分配)(或者在主程序终止后它是否被释放)? (3)如果第二个问题的答案是"是",那么如何释放在另一个函数中分配的数组?

注意:我希望保持在纯c的范围内,而不是溢出到c ++.

char *f1 (...) {
    ...
    ...
    char *fTmp = malloc (length1 * sizeof (char));
    char *fData = malloc (length2 * sizeof (char));
    ...
    ...
    free (fTmp);
    return (fData);
}

int main () {
    char *fData = f1 (...);
    ...
    return (0);
}
Run Code Online (Sandbox Code Playgroud)

c arrays malloc function

13
推荐指数
3
解决办法
2万
查看次数

(仅限XCode 7 + iOS 9 + iPhone 4s/iPhone5)问题:"malloc:***mach_vm_map(size = 1048576)失败(错误代码= 3)"

我知道这个问题与内存分配有关,但我只在iOS 9,XCode 7中得到它.在XCode 6.4,iOS 8.4中,它工作得很完美,在任何方面都没有问题.在iOS 9,XCode 7中,它只是经常崩溃而产生此错误.

malloc: *** mach_vm_map(size=1048576) failed (error code=3) *** error: can't allocate region securely *** set a breakpoint in malloc_error_break to debug

有什么建议?我正在处理内存问题,但我想知道是否存在太多内存问题,那么为什么它在iOS 8.4中工作而在iOS 9中不起作用?

另外,我把所有的UI都搞砸了!就像导航栏没有标题一样,自定义标签栏(RDVTabBar)不可见,但是,其他视图控制器就在那里(它响应触摸事件,您可以点击该区域,并且位于该区域的按钮起作用!).

PS我没有得到内存警告,也没有applicationWillTerminate:调用任何方法!

更新:我发现此问题仅发生在iPhone 5和4s中!(非64位设备!)

更新2:当崩溃发生时,我尝试打印其中一个对象并打印它,我再次在调试模式下得到相同的错误: malloc: *** mach_vm_map(size=1048576) failed (error code=3) *** error: can't allocate region securely *** set a breakpoint in malloc_error_break to debug.

------------------更新------------------

好吧,我在这里找到了一些东西:我在仪器中检查了我的应用程序并检测到它在iOS 8.4中占用了大约200mb的内存,而且令人惊讶的是iOS 9.*占用了1.5 GB的内存!这是我不明白的事情!一个应用程序在iOS 8.4中占用200 MB的内存,同一个应用程序在iOS 9上占用超过1.5GB的内存!根本不可理解!任何的想法?

malloc ios9 xcode7 ios8.4 xcode6.4

13
推荐指数
1
解决办法
7505
查看次数

是否有可能在C中编写一致的malloc实现?

这是一个可以将char数组与任何数据类型一起使用的后续内容吗?

我知道动态内存和malloc的常见实现,可以在维基百科上找到引用.我也知道malloc返回的指针可以转换成程序员想要的任何东西,甚至没有警告,因为6.3.2.3指针中的标准状态§1

指向void的指针可以转换为指向任何不完整或对象类型的指针.指向任何不完整或对象类型的指针可能会转换为指向void的指针并再次返回; 结果应该等于原始指针.

现在的问题是假设我有没有一个独立的环境mallocfree,我怎么可以建立兼容标准的C的这两个功能的实现?

如果我对标准采取一些自由,很容易:

  • 从一个大字符数组开始
  • 使用一个相当大的对齐(8对于许多架构应该足够)
  • 实现一个算法,该算法从该数组返回地址,在该路线上,跟踪已分配的内容 - 在malloc实现中可以找到很好的例子

问题是该实现返回的指针的有效类型仍然是 char *

标准在同一段§7中说明

指向对象或不完整类型的指针可以转换为指向不同对象或不完整类型的指针.如果生成的指针未针对指向类型正确对齐,则行为未定义.否则,当再次转换回来时,结果将等于原始指针.

这似乎不允许我假装被声明为简单字符的内容可以神奇地包含另一种类型,甚至在该数组的不同部分或同一部分中的不同时刻也可以包含不同的类型.不同地解释引用这样的指针似乎是未定义的行为,并严格解释标准.这就是为什么memcpy当你在字符串缓冲区中获得对象的字节表示时,例如当你从网络流中读取它时,常用的习惯用法而不是别名.

那么如何在纯C中构建一个符合malloc的实现呢?

c malloc language-lawyer

13
推荐指数
1
解决办法
497
查看次数

为什么当内存足够时malloc()会失败?

我正在使用128GB内存的服务器来进行一些计算.我需要malloc()一个大小为56120*56120的2D float数组.示例代码如下:

int main(int argc, char const *argv[])
{
    float *ls;
    int num = 56120,i,j;
    ls = (float *)malloc((num * num)*sizeof(float));
    if(ls == NULL){
        cout << "malloc failed !!!" << endl;
        while(1);
    }
    cout << "malloc succeeded ~~~" << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

代码编译成功,但是当我运行它时,它说"malloc failed !!!".据我计算,只需要大约11GB的内存来容纳整个阵列.在我开始代码之前,我检查了服务器,并且有110GB的可用内存.为什么会发生错误?

我还发现,如果我减少num到40000,那么malloc将会成功.

这是否意味着可以分配的最大内存有限制malloc()

而且,如果我改变分配方式,直接声明这样大小的2D float数组,如下:

int main(int argc, char const *argv[])
{
    int num = 56120,i,j;
    float ls[3149454400];
    if(ls == NULL){
        cout << "malloc failed !!!" << …
Run Code Online (Sandbox Code Playgroud)

c c++ memory malloc

13
推荐指数
4
解决办法
2738
查看次数

使用new char []或malloc的结果来表示浮动*是UB(严格别名冲突)吗?

哪些代码有UB(具体来说,哪些违反了严格的别名规则)?

void a() {
    std::vector<char> v(sizeof(float));
    float *f = reinterpret_cast<float *>(v.data());
    *f = 42;
}

void b() {
    char *a = new char[sizeof(float)];
    float *f = reinterpret_cast<float *>(a);
    *f = 42;
}

void c() {
    char *a = new char[sizeof(float)];
    float *f = new(a) float;
    *f = 42;
}

void d() {
    char *a = (char*)malloc(sizeof(float));
    float *f = reinterpret_cast<float *>(a);
    *f = 42;
}

void e() {
    char *a = (char*)operator new(sizeof(float));
    float *f = reinterpret_cast<float *>(a);
    *f = …
Run Code Online (Sandbox Code Playgroud)

c++ malloc strict-aliasing object-lifetime language-lawyer

13
推荐指数
1
解决办法
481
查看次数

Linux是否保证在程序退出时释放malloc'd不同的内存?

我曾经相信它确实存在但是...我无法明确说明它.

man 3 exitman 2 _exit详细说明了进程终止的影响,但没有提到内存泄漏.

Posix走近了:它提到了这个:

  • 在进程被销毁之前,应该在进程中创建的内存映射取消映射.

  • [TYM] [Option Start]在调用进程中映射的任何类型内存块都应取消映射,就像munmap()隐式调用它们取消映射它们一样.[选项结束]

混合这个man 3 malloc:

通常,malloc()从堆中分配内存,并根据需要使用调整堆的大小sbrk(2).当分配大于MMAP_THRESHOLD字节的内存块时,glibc malloc()实现将内存分配为私有匿名映射使用mmap(2).

因此,我们可以得出结论,如果malloc调用,mmap则进程终止可能会进行相应的调用munmap,但是......(a)此POSIX规范中的这个"可选功能"标记令人担忧,(b)这是mmap怎么回事sbrk?(c)Linux不是100%符合POSIX,所以我不确定是否强制将Linux文档与Posix规范混合使用

我问的原因是这个......当图书馆通话失败时,我是否可以退出?

if(somecall() == -1) {
    error(EXIT_FAILURE, errno, "Big fat nasty error.\n");
}
Run Code Online (Sandbox Code Playgroud)

还是我上去栈确保一切都一路攀升到main()free()"d和来电exiterrormain()

前者简单得多.但是为了让前者感到轻松,我想在明确提到的文档中找到它,这不是一个错误,这样做是安全的.正如我所说的那样,事实上,文档明确提到了一些肯定会被清理的保证,但没有提到这个特定的保证让我感到不安.(这不是最常见和最明显的案例吗?首先不会提到这个吗?)

malloc posix memory-leaks terminate language-lawyer

13
推荐指数
2
解决办法
412
查看次数