标签: malloc

以线程安全的方式使用glibc malloc钩子

我想通过使用malloc和free hook监视应用程序中mallocs和frees的使用.

这是文档http://www.gnu.org/s/libc/manual/html_node/Hooks-for-Malloc.html

在示例页面中,您可以看到,my_malloc_hook在重新调用malloc之前,会暂时关闭malloc挂钩(或链中的前一个挂钩).

监视多线程应用程序时这是一个问题(请参阅问题末尾以获得解释).

我在互联网上找到的使用malloc钩子的其他例子也有同样的问题.

有没有办法重新编写此函数以在多线程应用程序中正常工作?

例如,是否有一个内部libc函数,malloc钩子可以调用它来完成分配,而不需要停用我的钩子.

由于公司的法律政策,我无法查看libc源代码,因此答案可能很明显.

我的设计规范说我不能用不同的malloc设计替换malloc.

我可以假设没有其他钩子在玩.


UPDATE

由于在为malloc提供服务时临时删除了malloc钩子,因此另一个线程可能会调用malloc而不是获取钩子.

有人建议malloc有一个很大的锁定来防止这种情况发生,但它没有记录,而且我有效地递归调用malloc的事实表明任何锁必须存在于钩子之后,或者是快活的聪明:

caller -> 
  malloc -> 
    malloc-hook (disables hook) -> 
      malloc -> # possible hazard starts here
        malloc_internals
      malloc <-
    malloc-hook (enables hook) <-
  malloc
caller
Run Code Online (Sandbox Code Playgroud)

c malloc glibc

12
推荐指数
1
解决办法
9316
查看次数

如何确保动态分配的数组在openmp中是私有的

我在Linux机器上使用gcc使用openMP在C中工作.在openmp并行for循环中,我可以将静态分配的数组声明为private.考虑代码片段:

int a[10];
#pragma omp parallel for shared(none) firstprivate(a)
for(i=0;i<4;i++){
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作.但如果相反我动态分配,

int * a = (int *) malloc(10*sizeof(int));
#pragma omp parallel for shared(none) firstprivate(a)
Run Code Online (Sandbox Code Playgroud)

a(至少a [1 ... 9])的值不受保护,但就好像它们是共享的一样.这是可以理解的,因为pragma命令中的任何内容似乎都没有告诉omp需要私有的数组a有多大.我怎样才能将这些信息传递给openmp?如何将整个动态分配的数组声明为私有?

c malloc parallel-processing openmp

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

在C中是malloc(256)和malloc(sizeof(char)*256)等价吗?

我看到人们经常编写C代码,例如:

char *ptr = malloc(sizeof(char)*256);
Run Code Online (Sandbox Code Playgroud)

这真的有必要吗?标准说,sizeof(char)==1根据定义,只写这样有意义:

char *ptr = malloc(256);
Run Code Online (Sandbox Code Playgroud)

谢谢,Boda Cydo.

c malloc pointers sizeof

12
推荐指数
2
解决办法
8885
查看次数

我应该在异常终止时释放分配的内存吗?

我的程序(文本模式Web浏览器)动态分配内存.

当然,我在运行时释放不需要的块.并且我在正常终止之前释放所有内容 - 因此内存泄漏检查器不会给我误报(并且如果需要进行重大重构则要灵活).

现在,我也不会做的是异常终止之前释放内存.(目前,我的程序在信号和mallocs/reallocs失败后终止.)

我的问题是:你认为这种不好的风格吗?我应该免费异常终止吗?

c malloc free

12
推荐指数
1
解决办法
1381
查看次数

这个错误暗示了什么?

当我试图执行我的程序时它得到的错误是这样的 -

sendip: malloc.c:4631: _int_malloc: Assertion `(unsigned long)(size)
 >= (unsigned long)(nb)' failed
Run Code Online (Sandbox Code Playgroud)

通过valgrind尝试捕获错误,得到了这个 -

   HEAP SUMMARY:
   ==3335==     in use at exit: 24 bytes in 2 blocks 
   ==3335==   total heap usage: 111 allocs, 109 frees, 7,929 bytes allocated
   ==3335== 
   ==3335== 4 bytes in 1 blocks are definitely lost in loss record 1 of 2
   ==3335==    at 0x40268A4: malloc (vg_replace_malloc.c:236)
   ==3335==    by 0x8049EEF: main (sendip.c:435)
   ==3335== 
   ==3335== 20 bytes in 1 blocks are definitely lost in loss record 2 of 2
   ==3335== …
Run Code Online (Sandbox Code Playgroud)

c malloc pointers memory-leaks

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

初始化C动态数组

如何初始化使用malloc分配的动态数组?我可以这样做:

int *p;
p = malloc(3 * sizeof(*p));
p = {0, 1, 2};

...

free(p);
Run Code Online (Sandbox Code Playgroud)

或者我需要做这样的事情:

int *p, x;
p = malloc(3 * sizeof(*p));
for (x = 0; x < 3; x++)
    p[x] = 0;

...

free(p);
Run Code Online (Sandbox Code Playgroud)

或者有更好的方法吗?

c arrays malloc

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

为什么malloc没有"耗尽"我电脑上的内存?

所以我有这个程序分配256 MB的内存,并在用户按下ENTER后释放内存并终止.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    char *p, s[2];

    p = malloc(256 * 1024 * 1024);
    if ( p == NULL) 
        exit(1);

    printf("Allocated"); 
    fgets(s, 2, stdin);
    free(p);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我多次运行这个程序并对每个程序进行后台处理,直到没有足够的内存可以分配.但是,这从未发生过.我运行了一个linux top命令,甚至在多次运行这个程序之后,空闲内存永远不会下降到256 MB.

但是,另一方面,如果我使用calloc而不是malloc那时有一个巨大的差异:

p = calloc(256 * 1024 * 1024, 1);

现在,如果我运行该程序并对其进行后台处理,并重复,每次运行它时,可用内存将减少256 MB.为什么是这样?为什么不会malloc导致可用的可用内存发生变化,但是calloc呢?

c linux malloc memory-management

12
推荐指数
3
解决办法
2424
查看次数

如何在cython中为np.ndarray处理内存?

例如,如果我这样做:

cdef np.ndarray[np.int64_t, ndim=1] my_array
Run Code Online (Sandbox Code Playgroud)

我的my_array存放在哪里?我认为,因为我没有告诉cython存储在堆上它会存储在堆栈上,但是在进行下面的实验之后,它似乎存储在堆上,或者以某种方式有效地管理内存.如何管理内存my_array?也许我错过了一些明显的东西,但我找不到任何文件.

import numpy as np
cimport cython
cimport numpy as np

from libc.stdlib cimport malloc, free

def big_sum():
    # freezes up:
    # "a" is created on the stack
    # space on the stack is limited, so it runs out

    cdef int a[10000000]

    for i in range(10000000):
        a[i] = i

    cdef int my_sum
    my_sum = 0
    for i in range(10000000):
        my_sum += a[i]
    return my_sum

def big_sum_malloc():
    # runs fine:
    # "a" …
Run Code Online (Sandbox Code Playgroud)

python malloc numpy cython

12
推荐指数
1
解决办法
714
查看次数

在父级中的malloc之后的fork ...子进程是否需要释放它?

你头脑中的问题答案:是的,这是针对学校的.不,我不能使用线程.是的,我寻找答案,有些人说"是",其他人则说"不".我也正在检查我的教授,因为如果其他人要对其进行评分并且他们要求"修复",我不想不公平地失去分数.

有了这样说......在Linux系统上考虑这个简单的c程序.我malloc的东西,然后叉.我把我的项目归结为确切的问题:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>

int main( void )
{
    char * args [] = { "someinvalidcommand", NULL };

    // malloc before the fork (happens in parent process)
    char * something = (char *)malloc(sizeof(char));

    pid_t child_pid = fork();

    // are there now two things that need to be freed:
    // one for each process?

    if(child_pid == 0) // child process
    {
        //free(something); // is this needed?

        // execvp (it won't return if succeeded) …
Run Code Online (Sandbox Code Playgroud)

c malloc fork dynamic execvp

12
推荐指数
2
解决办法
6300
查看次数

C中限制性最强的类型是什么意思?

" C编程语言 "一书在第8.7节" 实例 - 存储分配器 "中讨论了"限制性最强的类型" :

虽然机器各不相同,但每台机器都有一个限制性最强的类型:如果限制性最强的类型可以存储在特定地址,则所有其他类型也可以.在某些机器上,限制最多的类型是a double; 在别人身上,int或是long足够的.

在他们的代码中,union header使用类型对齐long.

限制性最强的是什么意思?它可能是最大的类型(例如double),还是有另一种方法?

c architecture malloc memory-alignment long-integer

12
推荐指数
2
解决办法
1207
查看次数