相关疑难解决方法(0)

malloc()和free()如何工作?

我想知道如何malloc和free工作.

int main() {
    unsigned char *p = (unsigned char*)malloc(4*sizeof(unsigned char));
    memset(p,0,4);
    strcpy((char*)p,"abcdabcd"); // **deliberately storing 8bytes**
    cout << p;
    free(p); // Obvious Crash, but I need how it works and why crash.
    cout << p;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果答案在记忆水平上是深入的,如果可能的话,我将非常感激.

c c++ malloc free memory-management

263
推荐指数
9
解决办法
14万
查看次数

malloc()/ free()在哪里存储分配的大小和地址?

malloc()和free()在哪里存储分配的地址及其大小(Linux GCC)?我已经读过一些实现将它们存储在实际分配的内存之前的某个地方,但是在我的测试中我无法确认.

背景,也许有人有另一个提示:我正在尝试分析进程的堆内存,以确定另一个进程中字符串的当前值.访问进程堆内存并在其中漫步是没有问题的.但是,因为字符串的值发生了变化,并且进程每次都会分配内存的新部分,所以字符串的地址会发生变化.因为字符串有一个固定的格式,它仍然很容易找到,但经过一些更改后,旧版本的字符串仍然在堆内存中(可能已释放,但仍未被重用/覆盖),因此我无法分辨哪个字符串是当前字符串.

所以,为了仍然找到当前的那个,我想检查我在内存中找到的字符串是否仍然被使用,通过比较它的地址与malloc/free知道的地址.

ciao,Elmar

c memory heap free

15
推荐指数
1
解决办法
7253
查看次数

为什么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
查看次数

标签 统计

c ×3

free ×2

malloc ×2

memory-management ×2

c++ ×1

heap ×1

linux ×1

memory ×1