较旧的K&R(第二版)和其他我读过的C语言文本讨论了动态内存分配器的实现方式,malloc()并且free()通常还提及有关数据类型对齐限制的内容.显然,某些计算机硬件体系结构(CPU,寄存器和内存访问)限制了如何存储和处理某些值类型.例如,可能要求long必须从4的倍数地址开始存储4字节()整数.
主要平台(英特尔和AMD,SPARC,Alpha)对内存分配和内存访问有什么限制(如果有的话),还是可以安全地忽略在特定地址边界上对齐内存分配?
当我使用时LD_PRELOAD=/usr/local/lib/libtcmalloc.so,我对malloc的所有调用都变成了tcmalloc调用.但是,当我静静地链接到libtcmalloc时,我发现直接malloc被调用,除非我仍然使用该LD_PRELOAD设置.
那么我怎么能以这样的方式静态编译tcmalloc,使我的mallocs挂钩到tcmalloc?
笔记:
我的服务器守护程序在大多数机器上工作正常,但是我得到的是:
malloc.c:3074: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1)
- 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) ||
((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct
malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) -
1)))&& ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Run Code Online (Sandbox Code Playgroud)
gdb回溯:
#4 0x002a8300 in sYSMALLOc (av=<value optimised out>, bytes=<value optimised out>) at malloc.c:3071
#5 _int_malloc (av=<value optimised out>, bytes=<value optimised out>) at malloc.c:4702
#6 0x002a9898 in …Run Code Online (Sandbox Code Playgroud) 我正在读期末考试,我偶然发现了一个奇怪的问题,这是我们老师去年给一些可怜的灵魂所做的考试的一部分.问题是这样的:
以下程序是否正确?如果是,请记下程序输出的内容.如果不是,请写下原因.
该程序:
#include<iostream.h>
class cls
{ int x;
public: cls() { x=23; }
int get_x(){ return x; } };
int main()
{ cls *p1, *p2;
p1=new cls;
p2=(cls*)malloc(sizeof(cls));
int x=p1->get_x()+p2->get_x();
cout<<x;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的第一直觉是回答"程序不正确,new应该用来代替malloc".但是,在编译程序并查看输出后,23我意识到答案可能不正确.
问题是我期望p2->get_x()返回一些任意数字(无论发生什么事情都在malloc被调用的内存中).然而,它返回0.我不确定这是巧合还是类成员在malloc-ed 时被初始化为0 .
p2->x在0之后malloc)是默认的吗?我应该预料到这一点吗?#include <stdlib.h>了malloc:P)有没有一种很好的方法来组合来自C99的指定初始化器,结果是malloc?
以下似乎有不必要的重复:
typedef struct {
int a, b, c;
} Type;
Type *t = malloc(sizeof *t);
*t = (Type) {
.a = 2,
.b = 3,
.c = 5,
};
Run Code Online (Sandbox Code Playgroud)
可以使用Type,并*t从上面的代码中删除?
以下代码工作正常:
#include <stdio.h>
#include <stdlib.h>
int main()
{
struct node{
int a, b, c, d, e;
};
struct node *ptr = NULL;
printf("Size of pointer ptr is %lu bytes\n",sizeof (ptr));
printf("Size of struct node is %lu bytes\n",sizeof (struct node));
ptr = (struct node*)malloc(sizeof (ptr)); //Line 1
// ptr = (struct node*)malloc(sizeof (struct node)); //Line 2
ptr->a = 1; ptr->b = 2; ptr->c = 3; ptr->d = 4; ptr->e = 5;
printf("a: %d, b: %d, c: %d, d: %d, e: %d\n", …Run Code Online (Sandbox Code Playgroud) 在"内部C++对象模型"一书的第6.3节中,临时对象(第230页):
实际结果取决于实现依赖于底层删除操作符实际释放所寻址的内存的积极程度.某些实现虽然将内存标记为空闲,但实际上并未以任何方式对其进行更改.在内存被其他内容声明之前,可以使用它,就像它没有被删除一样.虽然显然不是软件工程的示例性方法,但是在释放它之后访问内存的这种习惯并不罕见. 事实上,许多实现
malloc()提供了一种特殊的调用malloc(0);来保证这种行为.
根据以上所述,malloc(0)似乎与访问已经被释放的存储器(但其内容未被改变)有关.
我的问题是如何malloc(0)保证这种行为?
我知道这可能是一个愚蠢的问题,但我一直在寻找一段时间,但无法找到明确的答案.如果我使用mmap或malloc(在C中,在Linux机器上)任何一个在RAM中分配空间?例如,如果我有2GB的RAM并且想要使用所有可用的RAM,我可以使用malloc/memset组合mmap,或者是否有另一种我不知道的选项?
我想编写一系列可以同时运行的简单程序,并保持进程中使用的所有RAM强制使用交换,并且频繁地交换页面.我已经尝试过以下程序,但这并不是我想要的.它确实分配内存(RAM?),并强制使用交换(如果有足够的实例正在运行),但是当我调用时sleep不会只是锁定内存被使用(因此实际上没有任何内容与其他内容进行交换)过程?),或者我误解了什么.
例如,如果我运行了3次,那么我将使用前两个实例中的2GB(全部)RAM,然后第三个实例会将前两个实例中的一个(RAM)和当前实例交换到RAM中吗?或者实例#3是否只使用磁盘或虚拟内存运行?
这提出了另一点,我是否需要分配足够的内存来使用所有可用的虚拟内存以及要使用的交换分区?
最后,将mmap(或任何其他C函数.地狱,甚至是另一种语言,如果适用)更好地做到这一点?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MB(size) ( (size) * 1024 * 1024)
#define GB(size) ( (size) * 1024 * 1024 * 1024)
int main(){
char *p;
p = (char *)malloc(MB(512));
memset(p, 'T', MB(512));
printf(".5 GB allocated...\n");
char *q;
q = (char *)malloc(MB(512));
memset(q, 'T', MB(512));
printf("1 GB allocated...\n");
printf("Sleeping...\n");
sleep(300);
}
Run Code Online (Sandbox Code Playgroud)
**编辑:我正在为我的操作系统使用CentOS 6.4(带有3.6.0内核),如果这有帮助的话.
我正在尝试malloc在结构中的数组,但我运行程序时不断收到分段错误.
这个compares功能只是我正在测试的东西,所以它不应该成为问题的一部分
typedef struct {
char *string;
} prod_t;
int
main(int agrc, char **argv){
int i = 0;
prod_t *c = NULL;
char str2[100] = "abcd";
c->string = (char *) malloc( 5 * sizeof(char));
strcpy(c->string,str2);
compares(c->stock,str2,i);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我已经学习了一段时间的指针,我似乎无法完全绕过它.当您从解释指向实际函数的指南和假设您了解它们的代码跳转时,似乎存在一个无法解释的差距.令我烦恼的代码如下:
char **output_str = malloc(sizeof(char*));
Run Code Online (Sandbox Code Playgroud)
好的,所以我的理解如下,
**output_str is a character
*output_str is a pointer to a character
output_str is a pointer to a pointer to a character
Run Code Online (Sandbox Code Playgroud)
据我所知,malloc()返回一个指向刚刚分配的内存开头的指针,该指针的大小值等于指向字符(char*)的指针的大小.现在,不应该指向内存开始的指针有一个*?如果是这样,我们怎样才能为*分配*?我很困惑,如果有人能提供一些澄清,并且可能对内存部分有一些了解,那将非常好.