标签: malloc

跨dll边界的内存分配和释放

我知道在一个dll中进行的内存分配然后随后在另一个dll中释放可能会导致各种问题,特别是关于CRT.在导出STL容器时,这些问题尤其成问题.我们之前遇到过这些问题(编写与我们的库链接的自定义Adobe插件时),我们通过定义我们在所有容器中使用的自己的分配器来解决这些问题,例如:

typedef std::vector < SessionFields, 
        OurAllocator < SessionFields > > 
        VectorSessionFields;

typedef std::set < SessionFields, 
        std::less < SessionFields >, 
        OurAllocator < SessionFields > > 
        SetSessionFields;
Run Code Online (Sandbox Code Playgroud)

在向我们的代码传递类型时,这很有效,但是我们遇到了一个问题,因为我们现在不得不在Adobe的SDK中调用一个函数来返回一个填充的向量,当它超出范围时会导致崩溃.

显然,在我的代码中最终免费的Adobe的SDK属于不同的堆中分配内存是一个问题.所以我想也许我可以做一些聪明的事情,比如以某种方式覆盖或导出SDK中使用的分配器,这样我就可以用它来清理从它们的函数返回的容器.

我也在考虑编写一个包装器或某种类型的thunking层,从而可以在我的代码和SDK之间安全地编组STL容器(虽然这听起来非常混乱).

或者,我也在考虑使用GetProcessHeaps来识别SDK 中使用的堆,并尝试释放这个堆,而不是默认堆.

有没有人就如何解决这个问题提出任何建议?

c++ malloc dll memory-management stl

8
推荐指数
2
解决办法
5730
查看次数

当试图释放由堆管理器分配的内存时会发生什么,它分配的内容超过了要求?

我在接受采访时问了这个问题.

假设char*p = malloc(n)分配多于n,比如分配N个字节的内存,free(p)用于释放分配给p的内存.

堆管理器可以执行这样的错误分配吗?现在发生了什么,将释放n个字节或释放N个字节?

有什么方法可以找到释放多少内存?

编辑

有什么方法可以找到释放多少内存?

有总比没有好,

mallinfo()可以像"Fred Larson"所指出的那样轻松一些

c c++ heap malloc free

8
推荐指数
1
解决办法
755
查看次数

使用malloc是否安全?

有人告诉我,分配malloc不再安全了,我不是C/C++大师,但我用malloc和C/C++做了一些东西.有谁知道我有什么风险?

引用他:

[..]但事实上,C/C++的弱点在于它的安全性,而阿喀琉斯的脚跟确实是malloc和滥用指针.C/C++它是一种众所周知的不安全语言.[..]我不建议继续用C++编程的应用程序很少."

c c++ malloc

8
推荐指数
3
解决办法
4358
查看次数

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

我正在尝试编写像这样的大小函数:

size(void *p,int size);
Run Code Online (Sandbox Code Playgroud)

这将返回p指向的数组的大小.例如:

Int *a = malloc((sizeof(int)*100));
size(a,sizeof(int)); // this should return 100
Run Code Online (Sandbox Code Playgroud)

我认为这是可能的,因为如果我记得,malloc会跟踪在某些头字节中分配的空间.

这是我到目前为止所拥有的:

int size(void *p, int size)
{
  p = (unsigned int *)p - 1;
  unsigned int elements = (*(unsigned int *)p);
  return elements/size;
}
Run Code Online (Sandbox Code Playgroud)

现在,假设分配的空间大小在指针之前的4个字节中,这应该返回字节或偏移量.这就是我在黑暗中的地方.我无法弄清楚malloc如何格式化这些头字节的细节.malloc如何打包标题位?

谢谢,我很感激.我确定这段代码有问题,而且它不是特别便携,可能与系统有关,但我这样做很有趣.

c malloc memory-management

8
推荐指数
2
解决办法
2602
查看次数

有没有理由在PyMem_Malloc上使用malloc?

我正在阅读Python C扩展中的内存管理文档,据我所知,似乎没有太多理由使用malloc而不是PyMem_Malloc.假设我想分配一个不暴露给Python源代码的数组,并将存储在一个将被垃圾收集的对象中.有什么理由可以使用malloc吗?

c python malloc python-c-extension

8
推荐指数
2
解决办法
3878
查看次数

为什么malloc真的不确定?(的Linux/Unix)

malloc不保证返回0的内存.传统观点不仅如此,而且内存malloc返回的内容实际上是非确定性的,例如openssl将它们用于额外的随机性.

但是,据我所知,malloc建立在brk/sbrk之上,它可以"返回"0'ed内存.我可以看到为什么malloc返回的内容可能不是0,例如来自以前的免费内存,但为什么它们在"普通"单线程软件中是非确定性的呢?

  1. 传统智慧是否真实(假设相同的二进制和库)
  2. 如果是这样,为什么?

编辑几个人回答解释为什么内存可以是非0,我已在上面的问题中解释过.我问的是为什么使用malloc返回的内容的程序可能是非确定性的,也就是为什么它每次运行时都会有不同的行为(假设相同的二进制文件和库).非0表示非确定性行为.换句话说:为什么每次运行二进制文件时它都有不同的内容.

c malloc non-deterministic linux-kernel

8
推荐指数
2
解决办法
1363
查看次数

Valgrind支持Mac OS 10.8?

我在Mac OS 10.8.2中使用valgrind 3.8.1我使用Homebrew安装了Valgrind.

但是当我尝试在我的代码上运行valgrind时,我从库中得到了一大堆错误,我甚至没有在我的代码中使用过.

valgrind --leak-check=full ./a.out

==92079== 
==92079== HEAP SUMMARY:
==92079==     in use at exit: 70,861 bytes in 362 blocks
==92079==   total heap usage: 529 allocs, 167 frees, 75,151 bytes allocated
==92079== 
==92079== 16 bytes in 1 blocks are definitely lost in loss record 7 of 85
==92079==    at 0x54D7: malloc_zone_malloc (in /usr/local/Cellar/valgrind/3.8.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==92079==    by 0x373381: recursive_mutex_init (in /usr/lib/libobjc.A.dylib)
==92079==    by 0x372025: _objc_init (in /usr/lib/libobjc.A.dylib)
==92079==    by 0xBB27: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==92079==    by 0x7FFF5FC13377: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) …
Run Code Online (Sandbox Code Playgroud)

debugging malloc macos valgrind memory-leaks

8
推荐指数
1
解决办法
598
查看次数

malloc错误检查方法

我已经看到了几种不同的方法来进行malloc错误检查.有一种方式比另一种更好吗?有些退出代码比其他代码更好吗?使用fprintf和stderr比使用printf语句更好吗?使用退货而不是退出更好?

    ptr=(int*)malloc(n*sizeof(int));  //memory allocated using malloc
    if(ptr==NULL)                     
    {
        printf("Error! memory not allocated.");
        exit(0);
    }

    ptr=(int*)malloc(n*sizeof(int));  //memory allocated using malloc
    if(ptr==NULL)                     
    {
        printf("Error! memory not allocated.");
        exit(1);
    }

    res = malloc(strlen(str1) + strlen(str2) + 1);
    if (!res) {
        fprintf(stderr, "malloc() failed: insufficient memory!\n");
        return EXIT_FAILURE;
    }

    ptr=(int*)malloc(n*sizeof(int));  //memory allocated using malloc
    if(ptr==NULL)                     
    {
        printf("Error! memory not allocated.");
        exit(-1);
    }

   ptr=(int*)malloc(n*sizeof(int));  //memory allocated using malloc
    if(ptr==NULL)                     
    {
        printf("Error! memory not allocated.");
        exit(EXIT_FAILURE);
    }

char *ptr = (char *)malloc(sizeof(char) * some_int);
if (ptr …
Run Code Online (Sandbox Code Playgroud)

c malloc

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

与K&R实施malloc混淆

我一直在阅读K&R,并在实施malloc()包含时遇到了一些困惑.

typedef long Align; /* for alignment to long boundary */

union header { /* block header */
  struct {
    union header *ptr; /* next block if on free list */
    unsigned size; /* size of this block */
  } s;
  Align x; /* force alignment of blocks */
};
typedef union header Header;

static Header base; /* empty list to get started */
static Header *freep = NULL; /* start of free list */

void *malloc(unsigned nbytes) …
Run Code Online (Sandbox Code Playgroud)

c malloc kernighan-and-ritchie

8
推荐指数
1
解决办法
630
查看次数

在malloc中,为什么要完全使用brk?为什么不只使用mmap?

malloc使用brk/ sbrk作为从OS声明内存的主要方式的典型实现。但是,它们还用于mmap获取大容量分配的块。使用brk代替确实有真正的好处mmap,还是仅仅是传统?将其与所有内容一起使用mmap是否会很好?

(注意:我在这里可以互换使用sbrkbrk因为它们是同一个Linux系统调用接口brk。)


作为参考,以下是一些描述glibc malloc的文档:

GNU C库参考手册:GNU分配器
https://www.gnu.org/software/libc/manual/html_node/The-GNU-Allocator.html

glibc Wiki:Malloc概述
https://sourceware.org/glibc/wiki/MallocInternals

这些文件所描述的是,它sbrk被用来声明一个小的分配的主要场所,mmap被用来声明一个次级的场所,mmap还被用来声明一个大对象(“比页面大得多”)的空间。

同时使用应用程序堆(带有sbrk),并mmap引入了一些其他不必要的复杂性:

分配的竞技场-主竞技场使用应用程序的堆。其他竞技场使用mmap堆。要将块映射到堆,您需要知道哪种情况适用。如果该位为0,则该块来自主区域和主堆。如果该位为1,则该块来自mmap的内存,并且可以从该块的地址计算出堆的位置。

[Glibc malloc源自ptmalloc,而ptmalloc则源自dlmalloc,后者始于1987年。]


jemalloc手册页(http://jemalloc.net/jemalloc.3.html)有这样一段话:

传统上,分配器使用sbrk(2)获取内存,由于一些原因,该内存不是最佳的,原因包括竞争条件,增加的碎片以及人为限制最大可用内存。如果操作系统支持sbrk(2),则此分配器将按优先顺序使用mmap(2)和sbrk(2);否则,此分配器将使用mmap(2)和sbrk(2)。否则,仅使用mmap(2)。

因此,他们甚至在这里说这sbrk不是次优的,但是无论如何他们还是会使用它,即使他们已经为编写代码而烦恼,以至于没有它就可以工作。

[jemalloc的编写始于2005年。]

更新:更多地考虑这一点,关于“按优先顺序”的一点让我对询问保持了一致。为什么选择优先顺序?它们是否只是sbrkmmap不支持(或缺少必要功能)的情况下用作备用,还是该进程可能进入可以使用sbrk但不能使用的状态mmap?我看一下他们的代码,看看是否能弄清楚它在做什么。


我之所以问是因为我正在用C实现垃圾回收系统,到目前为止,我看不到除之外的任何用途mmap。我想知道是否还有什么我想念的。

(就我而言,我还有另一个避免使用的原因brk,那就是malloc在某些时候可能需要使用。)

c linux malloc mmap brk

8
推荐指数
5
解决办法
557
查看次数