我想通过使用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) 我在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代码,例如:
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.
我的程序(文本模式Web浏览器)动态分配内存.
当然,我在运行时释放不需要的块.并且我在正常终止之前释放所有内容 - 因此内存泄漏检查器不会给我误报(并且如果需要进行重大重构则要灵活).
现在,我也不会做的是异常终止之前释放内存.(目前,我的程序在信号和mallocs/reallocs失败后终止.)
我的问题是:你认为这种不好的风格吗?我应该免费异常终止吗?
当我试图执行我的程序时它得到的错误是这样的 -
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) 如何初始化使用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)
或者有更好的方法吗?
所以我有这个程序分配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呢?
例如,如果我这样做:
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) 你头脑中的问题答案:是的,这是针对学校的.不,我不能使用线程.是的,我寻找答案,有些人说"是",其他人则说"不".我也正在检查我的教授,因为如果其他人要对其进行评分并且他们要求"修复",我不想不公平地失去分数.
有了这样说......在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编程语言 "一书在第8.7节" 实例 - 存储分配器 "中讨论了"限制性最强的类型" :
虽然机器各不相同,但每台机器都有一个限制性最强的类型:如果限制性最强的类型可以存储在特定地址,则所有其他类型也可以.在某些机器上,限制最多的类型是a
double; 在别人身上,int或是long足够的.
在他们的代码中,union header使用类型对齐long.
限制性最强的是什么意思?它可能是最大的类型(例如double),还是有另一种方法?