malloc()和free()在哪里存储分配的地址及其大小(Linux GCC)?我已经读过一些实现将它们存储在实际分配的内存之前的某个地方,但是在我的测试中我无法确认.
背景,也许有人有另一个提示:我正在尝试分析进程的堆内存,以确定另一个进程中字符串的当前值.访问进程堆内存并在其中漫步是没有问题的.但是,因为字符串的值发生了变化,并且进程每次都会分配内存的新部分,所以字符串的地址会发生变化.因为字符串有一个固定的格式,它仍然很容易找到,但经过一些更改后,旧版本的字符串仍然在堆内存中(可能已释放,但仍未被重用/覆盖),因此我无法分辨哪个字符串是当前字符串.
所以,为了仍然找到当前的那个,我想检查我在内存中找到的字符串是否仍然被使用,通过比较它的地址与malloc/free知道的地址.
ciao,Elmar
任何原因导致这不能成为标准行为free()
?
多个指针指向同一个对象:
#include <stdlib.h>
#include <stdio.h>
void safefree(void*& p)
{
free(p); p = NULL;
}
int main()
{
int *p = (int *)malloc(sizeof(int));
*p = 1234;
int*& p2 = p;
printf("p=%p p2=%p\n", p, p2);
safefree((void*&)p2);
printf("p=%p p2=%p\n", p, p2);
safefree((void*&)p); // safe
return 0;
}
Run Code Online (Sandbox Code Playgroud)
来自malloc
要求的转让void*
反之亦然:
safefree()
要求转向void*&
(参考)
今天,我出现了面试,面试官问我这个,
- 告诉我的步骤,你将如何设计自己的
free( )
功能,用于解除分配所分配的内存.- 它如何比C的默认
free()
功能更有效?你能得出什么结论?
我很困惑,想不出设计的方式.
你们觉得怎么样 ?
编辑:既然我们需要知道如何malloc()
工作,你能告诉我编写自己的malloc()
功能的步骤
我正在努力将许多C程序从Unix转换为Linux,这种free()语法引起了我的注意:
free((char *) area );
Run Code Online (Sandbox Code Playgroud)
这和之间有什么区别free( area );
?
我创建了一个旨在获取用户输入的函数.它要求将内存分配给保存用户输入的变量; 但是,该函数在函数结束时返回.释放已分配内存/返回变量值的正确方法是什么?
这是代码:
char *input = malloc(MAX_SIZE*sizeof(char*));
int i = 0;
char c;
while((c = getchar()) != '\n' && c != EOF) {
input[i++] = c;
}
return input;
Run Code Online (Sandbox Code Playgroud)
我应该返回输入地址并在使用后将其释放吗?
对于释放输入变量的最合适方法感到好奇.
我在讲座中被教过,free()
两次拨打指针真是非常糟糕.我知道NULL
在释放它之后立即设置指针是一种很好的做法.
但是,我仍然没有听到任何解释为什么会这样.根据我的理解,方式malloc()
有效,它应该在技术上跟踪它已经分配的指针并让你使用.那么为什么它不知道它接收到的指针是否free()
已被释放?
当你打电话free()
给以前已经被释放的位置时,我很乐意理解,内部会发生什么.
这合法吗?ptr
它可以在被释放后分配给它吗?
int * ptr = (int*) malloc(sizeof(int));
free(ptr);
ptr = (int *) malloc(sizeof(int));
Run Code Online (Sandbox Code Playgroud) 我在哪里可以找到我的gcc编译器目前使用的malloc代码?我实际上想编写自己的malloc函数,它与原版函数略有不同.我知道我可以使用hooks等等,但我希望看到真正的代码.
我已经为FDK-AAC实现了一个JNA桥.源代码可以在这里找到
在对我的代码进行基准测试时,我可以在同一输入上获得数百次成功运行,然后偶尔会发生C级崩溃,导致整个进程终止,从而导致生成核心转储:
看看核心转储,它看起来像这样:
#1 0x00007f3e92e00f5d in __GI_abort () at abort.c:90
#2 0x00007f3e92e4928d in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7f3e92f70528 "*** Error in `%s': %s: 0x%s ***\n") at ../sysdeps/posix/libc_fatal.c:181
#3 0x00007f3e92e5064a in malloc_printerr (action=<optimized out>, str=0x7f3e92f6cdee "corrupted size vs. prev_size", ptr=<optimized out>, ar_ptr=<optimized out>) at malloc.c:5426
#4 0x00007f3e92e5304a in _int_free (av=0x7f3de0000020, p=<optimized out>, have_lock=0) at malloc.c:4337
#5 0x00007f3e92e5744e in __GI___libc_free (mem=<optimized out>) at malloc.c:3145
#6 0x00007f3e113921e9 in FDKfree (ptr=0x7f3de009df60) at libSYS/src/genericStds.cpp:233
#7 0x00007f3e1130d7d3 in Free_AacEncoder (p=0x7f3de0115740) at libAACenc/src/aacenc_lib.cpp:407
#8 0x00007f3e1130fbb3 in aacEncClose …
Run Code Online (Sandbox Code Playgroud) 这个赋值要求我们使用malloc()
(命名var1
和var2
)分配两个int类型变量,打印每个变量的地址(堆栈上指针的地址和堆上的地址),然后free()
用来解除分配var1
,再次打印地址,然后在堆中分配另一个空间var1
并第三次打印地址.我相信教师试图告诉我们堆地址var1
应该改变,但它始终保持不变......除非我free(var1)
从代码中删除.教练做了类似的演示,但没有free()
用来解除分配任何变量,所以我们从来没有看到它应该如何工作.
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
void main()
{
int *var1 = (int*)malloc(sizeof(int));
*var1 = 1000;
int *var2 = (int*)malloc(sizeof(int));
*var2 = 2000;
printf("Addresses of var1\n");
printf("Pointer on stack: %p / Heap: %p\n\n", &var1, var1);
printf("Addresses of var2\n");
printf("Pointer on stack: %p / Heap: %p\n\n", &var2, var2);
free(var1);
printf("AFTER DEALLOCATING var1 FROM THE HEAP\n");
printf("Addresses of var1\n");
printf("Pointer on stack: %p / …
Run Code Online (Sandbox Code Playgroud)