Tag: malloc

全局覆盖visual c ++中的malloc

我试图找到一种在visual c ++(2005)中全局覆盖malloc和相关函数的方法。 我的设置是一个带有静态链接运行时库的DLL,它包含我自己的c ++代码,外部c ++和c代码。 我想要完成的是允许dll的用户设置他们自己的内存分配函数的实现。 我无法使用的解决方案: 全局覆盖new和delete,我的代码库中有很多外部C库,这意味着它不会捕获很多分配。 将malloc定义为不同的符号。 这将迫使我将此定义推送到所有使用的外部库的构建设置中,我真的想避免这种情况。 我不关心的事情 如果任何外部库以某种其他方式分配内存(HeapAlloc,内存映射文件或它们提出的任何内容),我接受通过重写malloc将无法正确跟踪它。 我能提出的最合理的解决方案是以某种方式干扰链接过程并确保我自己的malloc被链接而不是标准的,最好是我希望能够使用旧的malloc函数作为默认值。 在google perf-tools中 ,似乎他们在运行时手动修补函数的代码,以允许在调用原始函数之前调用钩子函数。 这真的是最好的方法吗?

C警告:函数返回局部变量的地址

下面的函数采用argv [0]参数,该参数包含应用程序的调用路径,并替换最后一位,直到它遇到一个“/”,其中包含我要生成的新应用程序的名称,该应用程序位于同一文件夹中。 BTW:我正在声明一个全局argv变量,因此该函数可以访问它,因为我不想在每个函数调用中传递信息。 当我编译我的代码时,一切似乎都有效,但我得到了上述警告。 我知道我正在声明变量,并且只要函数返回它就会被销毁。 作为初学C程序员,我想知道解决这个问题的最优雅/最简单的方法是什么? 我应该将指针传递给函数或malloc一些内存吗? char *returnFullPath() { char pathToApp[strlen(argv[0])+1]; strcpy(pathToApp, argv[0]); int path_length = strlen(argv[0]); while (pathToApp[path_length] != ‘/’) { path_length–; } if (path_length > 2) pathToApp[path_length+1] = ‘\0’; else pathToApp[0] = ‘\0’; // length of getcwd + length of pathtoapp + 1 for zero plus 6 for “bidbot” char bidbotPath[strlen(getcwd(NULL,0)) + […]

Malloc vs自定义分配器:Malloc有很多开销。 为什么?

我有一个图像压缩应用程序,现在有两个不同版本的内存分配系统。 在最初的一个中,malloc在任何地方都使用,在第二个中,我实现了一个简单的池分配器,它只分配一块内存并将部分内存返回给myalloc()调用。 当使用malloc时,我们注意到了巨大的内存开销:在内存使用的高度,malloc()代码对于1920x1080x16bpp映像需要大约170兆字节的内存,而池分配器仅分配48兆字节,其中47由程序使用。 在内存分配模式方面,程序为测试映像分配了大量8字节(大多数),32字节(许多)和1080字节块(一些)。 除此之外,代码中没有动态内存分配。 测试系统的操作系统是Windows 7(64位)。 我们如何测试内存使用情况? 使用自定义分配器,我们可以看到使用了多少内存,因为所有malloc调用都被赋予分配器。 使用malloc(),在调试模式下,我们只需逐步执行代码并在任务管理器中查看内存使用情况。 在发布模式下我们也做了同样的事情,但由于编译器优化了很多东西,所以我们无法逐步完成代码(发布和调试之间的内存差异大约为20MB,我将其归因于在发布模式下优化和缺少调试信息)。 可以单独使用malloc是导致如此巨大开销的原因吗? 如果是这样,究竟是什么原因导致malloc内部的开销?

当你可以使用指针时,使用malloc有什么意义?

你不能只使用指针存储尽可能多的数据吗? 为什么必须使用malloc()来获得更多内存? int * a; int max, i; printf(“Enter the maximum number you want: “); scanf(“%d”, &max); for (i = 0; i < max; i++) { * (a + i) = i; } for (i = 0; i < max; i++) { printf("%d\n", * (a + i)); } return 0; 所以我让用户选择任何数字,电脑会“分配内存”吗? 而不是使用以下代码: a = (int […]

在C中的malloc,但使用多维数组语法

有没有什么方法可以malloc一个大型数组,但用2D语法引用它? 我想要的东西: int *memory = (int *)malloc(sizeof(int)*400*200); int MAGICVAR = …; MAGICVAR[20][10] = 3; //sets the (200*20 + 10)th element 更新:这一点很重要:我只想拥有一个连续的内存块。 我只是不想写一个像: #define INDX(a,b) (a*200+b); 然后参考我的blob: memory[INDX(a,b)]; 我更喜欢: memory[a][b]; 更新:我理解编译器无法按原样知道。 我愿意提供额外的信息,例如: int *MAGICVAR[][200] = memory; 没有这样的语法吗? 请注意我不仅使用固定宽度数组的原因是它太大而无法放在堆栈上。 更新:伙计们,我可以这样做: void toldyou(char MAGICVAR[][286][5]) { //use MAGICVAR } //from another function: char *memory = (char *)malloc(sizeof(char)*1820*286*5); fool(memory); 我收到一个警告, […]

如何确保动态分配的数组在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++){ 一切都按预期工作。 但如果相反我动态分配, int * a = (int *) malloc(10*sizeof(int)); #pragma omp parallel for shared(none) firstprivate(a) a(至少a [1 … 9])的值不受保护,但就好像它们是共享的一样。 这是可以理解的,因为pragma命令中的任何内容似乎都没有告诉omp数组a需要私有多大。 如何将此信息传递给openmp? 如何将整个动态分配的数组声明为私有?

在gdb中包含malloc.c的源代码?

如何在gdb中包含/查看malloc的源代码? 我想在gdb逐步执行,并在调用任何malloc函数时进入malloc.c源代码。 目前gdb所说的是: malloc.c: No such file or directory. 这个人在这里遇到了同样的问题,但他们没有提到解决方案,即如何实际进入malloc的源代码。 我在Ubuntu server 14.04 ,我已经尝试安装以下软件: libc6-dbg , libc6-dev和libc6-dbgsym 。 我甚至不知道其中一个软件包是否有帮助,但是安装libc-dbgsym会给我带来以下错误: dpkg: error processing archive /var/cache/apt/archives/libc6-dbgsym_2.19-0ubuntu6.6_amd64.ddeb (–unpack): trying to overwrite ‘/usr/lib/debug/usr/lib/x86_64-linux-gnu/audit/sotruss-lib.so’, which is also in package libc6-dbg:amd64 2.19-0ubuntu6.6 dpkg-deb: error: subprocess paste was killed by signal (Broken pipe)

malloced数组VS. 变长数组

有两种方法可以为数组分配内存,其大小在开始时是未知的。 最常见的方法是使用像这样的malloc int * array; … // when we know the size array = malloc(size*sizeof(int)); 但是在我们知道尺寸后,在C99中定义数组也是有效的。 … // when we know the size int array[size]; 他们完全一样吗?

malloc归零内存?

鉴于这个用gcc 4.3.3编译的C代码 #include #include int main(int argc, char * argv[]) { int * i; i = (int *) malloc(sizeof(int)); printf(“%d\n”, *i); return 0; } 我希望输出是malloc()返回的内存中的任何内容,而输出是0. malloc是否将它返回的内存归零? 如果是这样,为什么?

检查`malloc`是否在C中成功

我想使用malloc分配内存并检查它是否成功。 就像是: if (!(new_list=(vlist)malloc(sizeof (var_list)))) return -1; 我如何检查成功?