标签: malloc

free和malloc如何在C中工作?

我试图找出如果我试图从中间"释放"指针会发生什么,请看下面的代码:

char *ptr = (char*)malloc(10*sizeof(char));

for (char i=0 ; i<10 ; ++i)
{
    ptr[i] = i+10;
}
++ptr;
++ptr;
++ptr;
++ptr;
free(ptr);
Run Code Online (Sandbox Code Playgroud)

我收到一个崩溃,出现未处理的异常错误消息.我想了解为什么以及如何免费工作,这样我不仅知道如何使用它,而且还能够理解奇怪的错误和异常并更好地调试我的代码ץ

非常感谢

c memory malloc free

58
推荐指数
6
解决办法
7万
查看次数

malloc()与HeapAlloc()

malloc()和HeapAlloc()有什么区别?据我所知,malloc从堆中分配内存,就像HeapAlloc一样,对吧?

那么区别是什么呢?

谢谢!

c++ malloc winapi

58
推荐指数
4
解决办法
4万
查看次数

Xcode Guard Malloc和设备调试:找不到'libgmalloc.dylib'图像

我在Xcode中启用了内存检查(编辑方案 - >选项).我在设备调试时执行以下操作: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会插入库?有什么解决方案吗?谷歌搜索返回了几个点击,但我没有看到任何具体的解决方案.

如何在设备上调试时启用Xcode Guard Malloc?

malloc xcode

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

为什么memcpy()的速度每4KB大幅下降?

我测试了memcpy()在i*4KB时注意速度急剧下降的速度.结果如下:Y轴是速度(MB /秒),X轴是缓冲区的大小memcpy(),从1KB增加到2MB.子图2和子图3详述了1KB-150KB和1KB-32KB的部分.

环境:

CPU:Intel(R)Xeon(R)CPU E5620 @ 2.40GHz

操作系统:2.6.35-22-通用#33-Ubuntu

GCC编译器标志:-O3 -msse4 -DINTEL_SSE4 -Wall -std = c99

每4k显示低谷的memcpy速度图

我想它必须与缓存相关,但我无法从以下缓存不友好的情况中找到原因:

由于这两种情况的性能下降是由不友好的循环引起的,这些循环将分散的字节读入高速缓存,浪费了高速缓存行的其余空间.

这是我的代码:

void memcpy_speed(unsigned long buf_size, unsigned long iters){
    struct timeval start,  end;
    unsigned char * pbuff_1;
    unsigned char * pbuff_2;

    pbuff_1 = malloc(buf_size);
    pbuff_2 = malloc(buf_size);

    gettimeofday(&start, NULL);
    for(int i = 0; i < iters; ++i){
        memcpy(pbuff_2, pbuff_1, buf_size);
    }   
    gettimeofday(&end, NULL);
    printf("%5.3f\n", ((buf_size*iters)/(1.024*1.024))/((end.tv_sec - \
    start.tv_sec)*1000*1000+(end.tv_usec - start.tv_usec)));
    free(pbuff_1);
    free(pbuff_2);
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

考虑到来自@ usr,@ ChrisW和@Leeor的建议,我更准确地重新测试了测试,下面的图表显示了结果.缓冲区大小从26KB到38KB,我每隔64B测试一次(26KB,26KB + …

memory malloc performance memcpy cpu-cache

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

使用malloc时,从`void*'无效转换为`char*'?

我在第5行的错误中遇到了以下代码的问题:

错误:无效转换void*char*

我正在使用g ++和codeblocks,我试图将此文件编译为cpp文件.有关系吗?

#include <openssl/crypto.h>
int main()
{
    char *foo = malloc(1);
    if (!foo) {
        printf("malloc()");
        exit(1);
    }
    OPENSSL_cleanse(foo, 1);
    printf("cleaned one byte\n");
    OPENSSL_cleanse(foo, 0);
    printf("cleaned zero bytes\n");
}
Run Code Online (Sandbox Code Playgroud)

c++ malloc g++

55
推荐指数
4
解决办法
8万
查看次数

malloc实现是否会将free-ed内存返回给系统?

我有一个长期存在的应用程序,频繁的内存分配 - 释放.任何malloc实现都会将释放的内存返回给系统吗?

在这方面,什么是以下行为:

  • ptmalloc 1,2(默认为glibc)或3
  • dlmalloc
  • tcmalloc(谷歌线程malloc)
  • solaris 10-11默认malloc和mtmalloc
  • FreeBSD 8默认malloc(jemalloc)
  • Hoard malloc?

更新

如果我有一个应用程序,其白天和夜晚的内存消耗可能非常不同(例如),我可以强制任何malloc将系统释放的内存吗?

如果没有这样的返回,释放的内存将被多次换出,但这样的内存只包含垃圾.

malloc free mmap glibc tcmalloc

54
推荐指数
4
解决办法
2万
查看次数

在C中,我如何选择是返回结构还是指向结构的指针?

最近在我的C肌肉上工作,并查看我一直在使用它的许多图书馆,这当然让我很好地了解了什么是好的做法.我没见过的一件事是一个返回结构的函数:

something_t make_something() { ... }
Run Code Online (Sandbox Code Playgroud)

从我所吸收的,这是"正确"的方式:

something_t *make_something() { ... }
void destroy_something(something_t *object) { ... }
Run Code Online (Sandbox Code Playgroud)

代码片段2中的体系结构比片段1更受欢迎.所以现在我问,为什么我会直接返回一个结构,就像在代码片段1中一样?当我在两种选择中做出选择时,我应该考虑哪些差异?

此外,该选项如何比较?

void make_something(something_t *object)
Run Code Online (Sandbox Code Playgroud)

c malloc struct pointers

54
推荐指数
4
解决办法
5310
查看次数

malloc(0)返回什么?

什么malloc(0)回报?答案是否相同realloc(malloc(0),0)

#include<stdio.h>
#include<malloc.h>
int main()
{
        printf("%p\n", malloc(0));
        printf("%p\n", realloc(malloc(0), 0));
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

linux gcc的输出:

manav@manav-workstation:~$ gcc -Wall mal.c
manav@manav-workstation:~$ ./a.out
0x9363008
(nil)
manav@manav-workstation:~$
Run Code Online (Sandbox Code Playgroud)

输出每次都在变化malloc(0).这是标准答案吗?除了学术研究之外,为什么有人会对获得这样的指针感兴趣?

编辑:

如果malloc(0)返回虚拟指针,那么后续工作原理如何:

int main()
{
    void *ptr = malloc(0);
    printf("%p\n", realloc(ptr, 1024));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

以下代码为每次迭代输出"可能".为什么不失败?

#include<stdio.h>
#include<malloc.h>
int main()
{

        int i;
        void *ptr;
        printf("Testing using BRUTE FORCE\n");
        for (i=0; i<65000; i++)
        {
                ptr = malloc(0);
                if (ptr == realloc(ptr, 1024))
                        printf("Iteration %d: possible\n", …
Run Code Online (Sandbox Code Playgroud)

c linux malloc pointers realloc

53
推荐指数
5
解决办法
3万
查看次数

C API设计:谁应该分配?

在C API中分配内存的正确/首选方法是什么?

我首先看到两个选项:

1)让调用者完成所有(外部)内存处理:

myStruct *s = malloc(sizeof(s));
myStruct_init(s);

myStruct_foo(s);

myStruct_destroy(s);
free(s);
Run Code Online (Sandbox Code Playgroud)

_init_destroy功能是必需的,因为一些更多的内存可分配里面,而且必须在某个地方处理.

这样做的缺点是更长,但在某些情况下也可以消除malloc(例如,它可以传递给堆栈分配的结构:

int bar() {
    myStruct s;
    myStruct_init(&s);

    myStruct_foo(&s);

    myStruct_destroy(&s);
}
Run Code Online (Sandbox Code Playgroud)

此外,调用者必须知道结构的大小.

2)隐藏mallocs in _initfreein in _destroy.

优点:代码更短,因为无论如何都会调用函数.完全不透明的结构.

缺点:无法传递以不同方式分配的结构.

myStruct *s = myStruct_init();

myStruct_foo(s);

myStruct_destroy(foo);
Run Code Online (Sandbox Code Playgroud)

我目前正在倾向于第一个案例; 然后,我不知道C API设计.

c api malloc memory-management

52
推荐指数
4
解决办法
6852
查看次数

tcmalloc/jemalloc和内存池之间的区别是什么

tcmalloc/jemalloc是改进的内存分配器,并且还引入了内存池以实现更好的内存分配.那么它们之间有什么区别以及如何在我的应用程序中选择它们呢?

c linux memory malloc tcmalloc

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

标签 统计

malloc ×10

c ×5

memory ×3

c++ ×2

free ×2

linux ×2

pointers ×2

tcmalloc ×2

api ×1

cpu-cache ×1

g++ ×1

glibc ×1

memcpy ×1

memory-management ×1

mmap ×1

performance ×1

realloc ×1

struct ×1

winapi ×1

xcode ×1