Tag: 内存管理

当我释放内存之前,malloc更快

当我分配和释放内存时,我之后分配最大大小的内存作为以前释放的部分。 可能第二次分配比第一次快吗? 也许是因为它已经知道一个免费的内存区域? 或者因为堆的这部分仍然分配给进程? 还有其他可能的优势吗? 或者它通常没有区别? 编辑:如评论中所述: 我对gcc和MSVC特别感兴趣。 我的假设是操作系统之前没有“赎回”内存。 由于关于实施的具体细节有很多,我想更清楚地说明这是一个假设的问题。 我不打算滥用这个,但我只是想知道如果这可能发生,假设加速可能是什么原因。

使用malloc循环来保证malloc的结果是不是很糟糕?

像这样分配内存是不好的做法吗?: FOO *foo; while (!(foo = malloc(sizeof(FOO)))) ;

C中的GetTotalMemory分配

我想在调用函数之前和之后分配总内存,以确定我是否已正确释放所有内容。 我在C中这样做,我很生疏,所以如果这是一个天真的问题请原谅我。 我正在寻找类似于C#GC.GetTotalMemory(true)的东西,现在在Windows中。 现在我正在使用PROCESS_MEMORY_COUNTERS_EX和GetProcessMemoryInfo(…) ,在调用函数之前和之后但是我无法对输出做出正面或反面,因为如果我进入函数并注释掉一个free(…)的调用free(…)然后它会给我相同的结果(之后总是更大)。 这就是我现在所拥有的…… GetProcessMemoryInfo(hProc, &before, sizeof(before)); r = c->function(); GetProcessMemoryInfo(hProc, &after, sizeof(after)); if(r->result != 0) { printf(“error: %s\r\n”, c->name); printf(” %s\r\n”, r->message); printf(” %s (%d)\r\n”, r->file, r->line); failed++; } else if(after.PrivateUsage > before.PrivateUsage) { printf(“memory leak: %s\r\n”, c->name); printf(” %d kb\r\n”, after.PrivateUsage – before.PrivateUsage); failed++; } else succeeded++; 得到这样的结果: after.PrivateUsage – before.PrivateUsage […]

自动/静态内存分配

也许是一个天真的问题,但…… 确认或否认: 自动和静态存储持续时间的对象/变量的内存的存在是在编译时确定的,并且由于没有足够的内存用于自动对象,程序将无法运行时运行。 当然,当自动对象的构造函数执行动态分配并且这样的分配失败时,我们认为这是动态分配的失败,而不是自动的。

为列表节点分配内存的安全方法

在一个简单的列表中,ex: struct Node { Node *next; void *data; } 如果我在一个分配中分配节点和数据(如果我知道大小),有什么问题,比如说 Node * t = (Node*)malloc(sizeof(Node) + DataSize)); 并始终在分配的块的末尾分配数据, t->data = (BYTE*)t+ sizeof(Node); /* BYTE is byte length, can use char in gcc */ 节点和数据将在sinlge go中删除,因此没有真正的问题紧密耦合它们(按设计) 我正在研究可移植性问题(特别是包装)或其他未知问题? 这种分配方式安全便携吗?

Malloc,strlen,strcat

以下是我正在编写的程序开头的一段代码(包含错误)。 char *name; char *name2; if (argn != 2) { printf(“You have to enter the name of the input file”); return 1; } name = malloc(strlen(arg[1]) + 1); name2 = malloc(strlen(arg[1]) + 1); strcpy(name, arg[1]); strcpy(name2, arg[1]); strcat(name2, “-results.pdb”); 这里有一个错误,就是strcat ,实际上name2没有足够的大小来执行上面的操作。 然而strcat执行没有问题。 然而,稍后在程序的一个完全不相关的部分中,在此strcat之后初始化的另一个数组的操作会产生错误。 它是一个整数数组,我为其元素赋值,并在分配所有值之前给出错误。 我假设因为在name2上没有足够的内存用于上面的操作,所以“某种程度上”会影响下一个初始化的数组。 我想了解: 1-这里可能发生什么,以便无法写入name2的额外信息会影响后面声明的其他数组? 2-我可能无法在更复杂的程序中轻易地回溯这个问题,因为错误发生在其他地方而不是strcat中。 我怎样才能防止这种偷偷摸摸的错误,如memory problematic进程影响其他地方完全不相关的数组?

并发访问和没有数据结构

问题是这样的: 我有一个500指针的数组,指向双链表中的500个元素。 有10个线程并行运行。 每个线程运行50个循环,并尝试释放列表中的某些元素。 列表已排序(包含简单整数),并且还有10个其他线程并行运行,搜索包含特定整数的节点并访问此节点中的其他卫星数据。 所以节点就像: struct node { int key; // Key used to search this nodes int x,y,z; // Satellite data struct node *prev; struct node *right; }; 如果我只是在搜索/删除之前锁定列表,则问题很容易解决。 但这太粗糙了。 我如何同步这些线程,以便我可以实现更好的并发? 编辑: 这不是一个家庭作业问题。 我不属于学术界。 持有500个指针的数组看起来很奇怪。 我已经做到了这样,以尽可能少的复杂性来形象化我的问题。

如何列出链接器分配的代码对象w / gcc?

我正在构建一个由几个代码模块和一个静态库组成的嵌入式应用程序。 一些全局变量显式放在专用内存部分(即,不是默认的.data部分)。 处理器内存架构是4个库,创建了连续的物理内存空间。 在我的应用程序中,只有第一个库被保留用于代码,而其他3个库被保留用于显式分配的全局和一个小堆栈。 问题是代码部分(.text)现在超出了第一个库边界,我得到以下链接器错误消息: ./bin/ld: section .data_bank1 loaded at [0000000000002000,0000000000003fff] overlaps section .text loaded at [0000000000000630,00000000000020df] ./bin/ld: section .fini loaded at [00000000000020e0,00000000000020f9] overlaps section .data_bank1 loaded at [0000000000002000,0000000000003fff] 有没有办法在链接器检查节和对象重叠之前查看对象分配(可能在临时对象文件中),并中止构建?

释放分配给void指针数组的内存

我正在声明一个void指针数组。 每个都指向任意类型的值。 void **values; // Array of void pointers to each value of arbitary type 初始化值如下: values = (void**)calloc(3,sizeof(void*)); //can initialize values as: values = new void* [3]; int ival = 1; float fval = 2.0; char* str = “word”; values[0] = (void*)new int(ival); values[1] = (void*)new float(fval); values[2] = (void*)str; //Trying to Clear the […]

使用read(..)从stdin读取并计算缓冲区的大小

我想知道是否有人可以告诉我,当使用read(…)从stdin read(…)输入时是否有动态分配缓冲区的方法例如: n = read(0, buffer, sizeof ?); 如何确保从stdin (此处为0)读取的字节数与buffer的相同?